<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity=60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0 0; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0;}
.wizardFooter .status {padding:0 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0 0 0.5em;}
.tab {margin:0 0 0 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0 0.25em; padding:0 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser

Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])

<<option txtUserName>>
<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
<<option chkRegExpSearch>> [[RegExpSearch]]
<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
<<option chkAnimate>> [[EnableAnimations]]

----
Also see [[AdvancedOptions]]
<<importTiddlers>>
<<tiddler MainMenuStore>>
----
*<<newTiddler>>
*[[Glossary]]
----
<<refList>>
----
<<forEachTiddler where 'tiddler.tags.contains("admin")' sortBy 'tiddler.title' write '"*[["+tiddler.title+"]]\n"'>>
[[edit|AdminMenuStore]]
<<options>>
!!How it works
[1>i[Centrifugation separates aggregates of unfolded proteins<br>from folded, soluble proteins.|wimages/aggregation.png]]Unfolded proteins expose hydrophobic regions, causing the proteins to aggregate. Insoluble protein aggregates can be removed from a cell [G[lysate|lysate]] by centrifugation. Membranes are removed from the pellet by solubilizing their lipids with the detergent NP-40, and the remaining aggregated proteins can then be quantitated by the [[Lowry assay|Lowry protein assay]].{{break{&nbsp;}}}
!!Materials
{{proctab{
|[[TE-PMSF buffer]]|| 6 ml/culture|
|[[PMSF]]|| 1 ml/culture|
|[[Lysozyme]]| 10 mg/ml| 150 &mu;l/culture|
|[[NP40]]| 10 %| 1500 &mu;l/culture|
|[[Guanidine HCl]]| 6M| 150 &mu;l/culture|
{{proctxt{
!!Procedure###Gur2004###
*Grow cells under desired condtions in 50-100 ml of medium in a 250-ml [G[baffle flask|baffle_flasks]].
*Transfer cells to a sterile 50-ml centrifuge tube on ice.
>If desired, cells can be split into two aliquots and one heated to 45&deg;C in a water bath for 15 min and then placed on ice. This allows the amount of aggregated protein already present in the cells to be compared to the amount of protein that can aggregate if exposed to heat stress.
*Centrifuge for 10 min at 7600&times;//g// and 4°C in a pre-chilled rotor.
*Remove supernatant and wash cells by resuspending pellet gently in 500 &mu;l fresh TE-PMSF```PMSF is @@color: red;very toxic@@. Wear gloves and a dust mask when weighing it out, gloves when working with PMSF-containing solutions.``` buffer.
*Transfer to pre-chilled microcentrifuge tubes and centrifuge in refrigerated microcentrifuge 5 min at 6500&times;//g// and 4°C.
*Remove supernatant thoroughly and freeze```Freezing and thawing facilitates lysis of cells.``` pellet at -80 &deg;C for at least 10 minutes (samples can be stored at -80 &deg;C at this stage for later processing).
*Resuspend pellet thoroughly in 500 &mu;l fresh TE-PMSF buffer. Add 50 &mu;l of [[lysozyme]]```Lysozyme breaks down the peptidoglycan cell wall and facilitates cell lysis.``` (10 mg/ml), mix and incubate 5 min on ice.
*[[Sonicate|Sonication]] on ice to lyse cells: 4 rounds of 10 1-second pulses at 40% power, cooling on ice between rounds.
*Centrifuge 10 min. at 2000&times;//g// and 4 &deg;C to remove any intact cells
*Transfer supernatant ([g[cell lysate|lysate]], or crude protein extract) to clean tube
*Remove 100 &mu;l for protein assay and freeze at -80 &deg;C
>This sample will allow the total amount of protein in the extract&mdash;soluble and insoluble&mdash;to be determined.
*Centrifuge remaining cell lysate sample 30 min at 16,000&times;//g// and 4 &deg; in refrigerated microcentrifuge to pellet membranes and aggregated proteins.
*Remove supernatant and resuspend pellet in 500 &mu;l 10% NP-40 (in TE-PMSF buffer) by vortexing vigorously.
>NP-40 will solubilize membrane proteins while minimally affecting protein aggregates.
*Sonicate briefly (5 pulses) to ensure aggregated proteins are resuspended.
*Centrifuge again, 30 min at 16,000&times;//g// to pellet detergent-insoluble protein aggregates.
*Repeat resuspension, sonication and centrifugation steps.
*Redissolve insoluble protein aggregates in 50 &mu;l of 6M guanidine-HCl: vortex vigorously, incubate 15 min at 37 &deg;C, sonicate briefly.
>Guanidine HCl is a strong protein denaturant in which almost any protein, even an aggregate, can be dissolved.
*This sample now contains the aggregated proteins. Freeze at -80 &deg;C until ready to do protein assays.
!!Analysis
*Use [[Lowry assay|Lowry protein assay]] to determine amount of protein (in &mu;g) in each total protein sample and each aggregated protein sample.
*Calculate amount of total protein (in &mu;g) for the sample as a whole (for example, if protein assay is done on a 5-&mu;l aliquot, then the total protein in the 500-&mu;l original lysate is 100&times; the calculated amount of protein.
*Calculate amount of aggregated protein (in &mu;g) for the aggregated protein samples (for example, if protein assay is done on a 10-&mu;l aliquot from the 50-&mu;l guanidine solution, then the total aggregated protein in the original 500-&mu;l lysate is 5&times; the calcuated amount &times; 1.25).
*Divide aggregated protein by total protein to get percent aggregated protein.
*If amount of aggregated protein is too low for Lowry assay (<5 &mu;g in 10 &mu;l aliquot), Micro BCA protein assay can be used instead.
}}}
//This outline is meant as a guide to possible directions as we start the summer. It is not meant as a "cookbook" or a set of directions. You should use it to help you get a handle on your project and get started on some experiments, but you should also analyze where you are at every step and think creatively about how best to proceed.//
!!!1. Optimize conditions for further experiments
*To obtain protein aggregates, we want to age 50-ml cultures with paraquat in 250-ml flasks. We need a concentration of paraquat that allows both //pcm//+ and &Delta;//pcm// cultures to survive 5 days but //pcm//+ cultures to survive better after 7-8 days.
*Test several concentrations of [[paraquat|Paraquat]], working around the concentration used by Sean Harrington.
*Cultures should be grown at 37&deg;C with shaking at 150 rpm. Flasks should be weighed daily and the weight used to make up evaporation loss with sterile water.
*Survival should be tested by [[viable counts|Stationary-phase survival assay]].
!!!2. Optimize aggregate isolation and assay
*While waiting for the cultures in #1, test some conditions that might make isolation and assay of aggregates easier. Use 24-hour cultures grown in tubes without paraquat for these tests.
*Compare everything to a culture in which aggregates are isolated by our [[standard procedure|Aggregated protein assay]] and total and aggregated protein assayed by the [[Lowry method|Lowry protein assay]]
*Compare cell lysis by sonication with lysis by the cell lysis reagent BPER-II
*Compare quantitation by the Lowry method with quantitation using the CBX assay kit
*Compare quantitation of aggregates solubilized in guanidine HCl with aggregates suspended in 10 mM Tris pH 7
*Decide on an optimized protocol to use for further experiments
!!!3. 
''Bacterial aging?'' Most people don't really think about bacteria getting old. Indeed, until recently, it was common to think of bacteria as essentially "immortal:" one "old" cell can divide to form two "young" ones, and each then continues to divide as long as nutrients are available. However, recent evidence ###Stewart2005### suggests that there is a distinct "mother" and "daughter" cell and that the mother cell cannot continue to divide indefinitely&mdash;[G[reproductive aging|reproductive_aging]] in fact occurs in bacteria. Bacteria are also good models for [G[chronological aging|chronological_aging]] at the cellular level###Nyström2002a######Nyström2003###: in [G[stationary phase|stat_phase]], when nutrients are limited and cells are dividing slowly or not at all, individual cells show [G[senescence|senescence]]: they lose their ability to function over time.

''Stationary phase'' begins as a fast-growing bacterial culture (e.g., in a rich laboratory culture medium) begins to exhaust the available nutrients. Cell division slows and eventually ceases, and the number of cells in the culture stabilizes (see the left panel below). The bacteria reduce their metabolic rate and activate a variety of genes to enable them to survive nutrient limitation and cope with stresses such as heat and oxidation that they might encounter before the return of nutrients###Siegele1992###. Soon, the cell number begins to decrease, marking what was once referred to as "death phase". More recently, however, we have realized that the cell number will eventually stabilize again and remain stable indefinitely, a state termed "long-term stationary phase" (right panel below). Although the number of cells changes little, this is actually a dynamic state in which some cells die, others can divide and mutants better equipped for survival can be selected###Finkel1999###.

[0I[Typical bacterial growth curves showing stationary phase (left) and long-term stationary phase (right)|wimages/stationary.jpg]]
''In long-term stationary phase'', //E. coli// behaves in many ways much like aging cells of higher organisms. During this time, metabolism is very limited, and a cell can survive only if it can maintain its macromolecules, including existing proteins, in a functional state. Oxidative damage and other environmental stresses are major causes of cell death, and stress protection is critical. Cellular functions decline over time, as does the cell's ability to recover successfully even when nutrients become available. Understanding successful long-term survival in //E. coli// can thus lead to enhanced understanding of successful aging at the cellular level in all organisms.
|rectab|k
| !Antibiotic |>| !Final concentration | !Stock solution```All stock solutions are prepared in dH~~2~~O and stored at 4 &deg;C unless otherwise indicated``` |
|~| !Rich medium | !Minimal medium |~|
|Ampicillin (Ap)| 100 &mu;g/ml| 15 &mu;g/ml|100 mg/ml, store at &ndash;20 &deg;C```Divide into aliquots and keep one working aliquot at 4 &deg;C```|
|Ampicillin (Ap), sodium salt| 100 &mu;g/ml| 15 &mu;g/ml|100 mg/ml in 50% EtOH; store at &ndash;20 &deg;C|
|Chloramphenicol (Cm)| 20 &mu;g/ml| 5 &mu;g/ml|20 mg/ml in EtOH|
|Kanamycin SO~~4~~ (Km)| 50 &mu;g/ml| 125 &mu;g/ml|50 mg/ml|
|Ofloxacin| 25 &mu;g/ml||25 mg/ml|
|Streptomycin (Sm)| 1 mg/ml| 2 mg/ml|100 mg/ml|
|Tetracycline HCl (Tc)| 20 &mu;g/ml| 10 &mu;g/ml|20 mg/ml in 70% EtOH|
// // version
//{{{
version.extensions.AttachPDFPlugin= {major: 1, minor: 0, revision: 0, date: new Date(2011,3,18)};
//}}}
// // define shadow tiddler and start attach macro
//{{{
config.shadowTiddlers.AttachPDF = "<<attach inline>>";
config.macros.attach = {
//}}}
// // lingo
//{{{
	label: "attach PDF",
	tooltip: "Attach a PDF to this document",
	linkTooltip: "Attachment: ",

	titlePrompt: " enter tiddler title...",
	localPrompt: " enter local path/filename...",
	URLPrompt: " enter remote URL...",
	PubGetPrompt: " enter PMID to link to PDF via PubGet...",

	sourceErr: "Please enter a source path/filename",
	storageErr: "Please select a storage method: local or remote",
	localErr: "Please enter a local path/filename",
	URLErr: "Please enter a remote URL",
	PubGetErr: "Please enter a PMID",
	fileErr: "Invalid path/file or file not found",

	tiddlerFormat: '!type\n%0\n!file\n%1\n!url\n%2\n!pubget\n%3\n',
//}}}
// // attach macro handler
//{{{
	handler:
	function(place,macroName,params) {
		if (params && !params[0]) { createTiddlyButton(place,this.label,this.tooltip,this.toggleAttachPanel); return; }
		var id=params.shift();
		this.createAttachPanel(place,id+"_attachPanel",params,id);
		document.getElementById(id+"_attachPanel").style.position="static";
		document.getElementById(id+"_attachPanel").style.display="block";
	},
//}}}
// // create or display attachment panel (form)
//{{{
	createAttachPanel:
	function(place,panel_id,params,title) {
		if (!panel_id || !panel_id.length) var panel_id="_attachPanel";
		// remove existing panel (if any)
		var panel=document.getElementById(panel_id); if (panel) panel.parentNode.removeChild(panel);
		// set styles for this panel
		setStylesheet(this.css,"attachPanel");
		// create new panel
		var pmid="";
                if (title != "") {
                  pmid = store.getValue(title,"pmid");
                  title += ".pdf";
                  }
		panel=createTiddlyElement(place,"span",panel_id,"attachPanel",null);
		var html=this.html.replace(/%id%/g,panel_id);
		html=html.replace(/%title%/g,title);
                if ( title != "" ) { 
                  html=html.replace(/%defref%/g,"./library/"+title);
                  html=html.replace(/%lstate%/g,"checked");
                  }
                else {
                  html=html.replace(/%defref%/g,"");
                  }
                if ( pmid != "" ) {
                  html=html.replace(/%pmid%/g,pmid);
                  html=html.replace(/%pstate%/g,"checked");
                  }
		panel.innerHTML=html;
		if (config.browser.isGecko) { // FF3 FIXUP
			document.getElementById("attachSource").style.display="none";
			document.getElementById("attachFixPanel").style.display="block";
		}
		return panel;
	},

	toggleAttachPanel:
	function (e) {
		if (!e) var e = window.event;
		var parent=resolveTarget(e).parentNode;
		var panel = document.getElementById("_attachPanel");
		if (panel==undefined || panel.parentNode!=parent)
			panel=config.macros.attach.createAttachPanel(parent,"_attachPanel");
		var isOpen = panel.style.display=="block";
		if(config.options.chkAnimate)
			anim.startAnimating(new Slider(panel,!isOpen,e.shiftKey || e.altKey,"none"));
		else
			panel.style.display = isOpen ? "none" : "block" ;
		e.cancelBubble = true;
		if (e.stopPropagation) e.stopPropagation();
		return(false);
	},
//}}}
// // interface definition - css styles and form html
//{{{
	css:
	".attachPanel { display: none; position:absolute; z-index:10; width:35em; right:105%; top:0em;\
		background-color: #eee; color:#000; font-size: 8pt; line-height:110%;\
		border:1px solid black; border-bottom-width: 3px; border-right-width: 3px;\
		padding: 0.5em; margin:0em; -moz-border-radius:1em;-webkit-border-radius:1em; text-align:left }\
	.attachPanel form { display:inline;border:0;padding:0;margin:0; }\
	.attachPanel select { width:99%;margin:0px;font-size:8pt;line-height:110%;}\
	.attachPanel input  { width:98%;padding:0px;margin:0px;font-size:8pt;line-height:110%}\
	.attachPanel textarea { width:98%;margin:0px;height:2em;font-size:8pt;line-height:110%}\
	.attachPanel table { width:100%;border:0;margin:0;padding:0;color:inherit; }\
	.attachPanel tbody, .attachPanel tr, .attachPanel td { border:0;margin:0;padding:0;color:#000; }\
	.attachPanel .box { border:1px solid black; padding:.3em; margin:.3em 0px; background:#f8f8f8; \
		-moz-border-radius:5px;-webkit-border-radius:5px; }\
	.attachPanel .chk { width:auto;border:0; }\
	.attachPanel .btn { width:auto; }\
	.attachPanel .btn2 { width:125px; }\
	",
	html:
	'<form>\
	  link to PDF file:\
	  <input type="file" id="attachSource" name="source" size="56"\
	    onChange="config.macros.attach.onChangeSource(this)">\
	  <div id="attachFixPanel" style="display:none"><!-- FF3 FIXUP -->\
	    <input type="text" id="attachFixSource" style="width:90%"\
	      title="Enter a path/file to attach"\
	      onChange="config.macros.attach.onChangeSource(this);">\
	    <input type="button" style="width:7%" value="..."\
	      title="Enter a path/file to attach"\
	      onClick="config.macros.attach.askForFilename(document.getElementById(\'attachFixSource\'));">\
	  </div><!--end FF3 FIXUP-->\
	  <div class="box">\
	    <table style="border:0">\
	      <tr style="border:0">\
	        <td style="border:0;text-align:right;width:1%;white-space:nowrap">\
	          local link <input type=checkbox class=chk name="useLocal"  %lstate%>&nbsp;\
	        </td>\
	        <td style="border:0">\
	          <input type=text name="local" size=15 autocomplete=off value="%defref%"\
	            onchange="this.form.useLocal.checked=this.value.length" \
	            onkeyup="this.form.useLocal.checked=this.value.length" \
	            onfocus="if (!this.value.length) this.value=config.macros.attach.localPrompt; this.select()">\
	        </td>\
	      </tr>\
	      <tr style="border:0">\
	        <td style="border:0;text-align:right;width:1%;white-space:nowrap">\
	          remote link <input type=checkbox class=chk name="useURL">&nbsp;\
	        </td>\
	        <td style="border:0">\
	          <input type=text name="URL" size=15 autocomplete=off value=""\
	            onfocus="if (!this.value.length) this.value=config.macros.attach.URLPrompt; this.select()"\
	            onchange="this.form.useURL.checked=this.value.length;"\
	            onkeyup="this.form.useURL.checked=this.value.length;">\
	        </td>\
	      </tr>\
	      <tr style="border:0">\
	        <td style="border:0;text-align:right;width:1%;white-space:nowrap">\
	          PMID (pubget)<input type=checkbox class=chk name="usePubGet" %pstate%>&nbsp;\
	        </td>\
	        <td style="border:0">\
	          <input type=text name="PubGet" size=15 autocomplete=off value="%pmid%"\
	            onfocus="if (!this.value.length) this.value=config.macros.attach.PubGetPrompt; this.select()"\
	            onchange="this.form.usePubGet.checked=this.value.length;"\
	            onkeyup="this.form.usePubGet.checked=this.value.length;">\
	        </td>\
	      </tr>\
	      <tr style="border:0">\
	        <td style="text-align:right;border:0" colspan=2>\
	          <input type=button class=btn2 id=atbtn value="attach" onclick=" jQuery(\'.aform\').hide(); config.macros.attach.onClickAttach(this);">\
	          <input type=button class=btn2 value="close"\
	            onclick="var panel=document.getElementById(\'%id%\'); if (panel) panel.parentNode.removeChild(panel); jQuery(\'.aform\').hide();">\
	          <input type=hidden name="tiddlertitle" value="%title%">\
	        </td>\
	      </tr>\
	    </table>\
	  </div>\
	</form>',
//}}}
// // control processing
//{{{
	onChangeSource:
	function(here) {
		var form=here.form;
		var theFilename  = here.value;
		var theExtension = theFilename.substr(theFilename.lastIndexOf('.')).toLowerCase();
		// if theFilename is in current document folder, remove path prefix and use relative reference
		var h=document.location.href; folder=getLocalPath(decodeURIComponent(h.substr(0,h.lastIndexOf("/")+1)));
		if (theFilename.substr(0,folder.length)==folder) theFilename='./'+theFilename.substr(folder.length);
		  else theFilename='file:///'+theFilename; // otherwise, use absolute reference
		theFilename=theFilename.replace(/\\/g,"/"); // fixup: change \ to /
		form.useLocal.checked = true;
		form.local.value = theFilename;
	},
	onClickAttach:
	function (here) {
		clearMessage();
		// get input values
		var form=here.form;
		var src=form.source;
		if (config.browser.isGecko) { src=document.getElementById("attachFixSource"); } // FF3 Fixup
		src=src.value!=src.defaultValue?src.value:"";
		var when=(new Date()).formatString(config.macros.timeline.dateFormat);
		var title=form.tiddlertitle.value;
		var local = form.local.value;
		var url = form.URL.value;
		var pubget = form.PubGet.value!=""?"http://pubget.com/paper/"+form.PubGet.value:"";
		var tags = "attachment pdf ";
		var useLocal=form.useLocal.checked;
		var useURL=form.useURL.checked;
		var usePubGet=form.usePubGet.checked;
		var mimetype = "application/pdf";
		// validate checkboxes and get filename
		if (useLocal) {
			if (local.length) { if (!theLocation) var theLocation = local; }
			else { alert(this.localErr); form.local.focus(); return false; }
		}
		if (useURL) {
			if (url.length) { if (!theLocation) var theLocation = url; }
			else { alert(this.URLErr); form.URL.focus(); return false; }
		}
		if (usePubGet) {
			if (pubget.length) { if (!theLocation) var theLocation = pubget; }
			else { alert(this.PubGetErr); form.PubGet.focus(); return false; }
		}
		if (!(usePubGet||useLocal||useURL))
			{ form.useLocal.focus(); alert(this.storageErr); return false; }
		if (!theLocation)
			{ src.focus(); alert(this.sourceErr); return false; }
		// attach the file
		return this.createAttachmentTiddler(src, when, tags, title, useLocal, useURL, usePubGet, local, url, pubget, mimetype);
	},
	createAttachmentTiddler:
	function (src, when, tags, title, useLocal, useURL, usePubGet, local, url, pubget, mimetype, noshow) {
		var theText=this.tiddlerFormat.format([
			mimetype,
			useLocal?local.replace(/\\/g,'/'):'',
			useURL?url:'',
			usePubGet?pubget:'']);
		store.saveTiddler(title,title,theText,config.options.txtUserName,new Date(),tags);
                var panel=document.getElementById("attachPanel"); if (panel) panel.style.display="none";
		if (!noshow) { story.displayTiddler(null,title); story.refreshTiddler(title,null,true); }
		displayMessage('attached "'+title+'"');
		return true;
	},
//}}}
// // file selector (also needs CoreTweaks #604, currently in Options)
//{{{
	askForFilename:
	function(target) {
		var msg=config.messages.selectFile;
		if (target && target.title) msg=target.title; // use target field tooltip (if any) as dialog prompt text
		// get local path for current document
		var path=getLocalPath(document.location.href);
		var p=path.lastIndexOf("/"); if (p==-1) p=path.lastIndexOf("\\"); // Unix or Windows
		if (p!=-1) path=path.substr(0,p+1); // remove filename, leave trailing slash
		var file=""
		var result=window.mozAskForFilename(msg,path,file,true); // FF3 FIXUP ONLY
		if (target && result.length) // set target field and trigger handling
			{ target.value=result; target.onchange(); }
		return result; 
     }
};
//}}}
// // Additional macros originally in AttachFilePluginFormatters

// // isAttachment macro to look for "attachment" in the tiddler tags
//{{{
if (config.macros.attach.isAttachment==undefined) config.macros.attach.isAttachment=function (title) {
	var tiddler = store.getTiddler(title);
	if (tiddler==undefined || tiddler.tags==undefined) return false;
	return (tiddler.tags.indexOf("attachment")!=-1);
}
//}}}
// // test for local file existence - returns true/false without visible error display
//{{{
if (config.macros.attach.fileExists==undefined) config.macros.attach.fileExists=function(f) {
	if(window.Components) { // MOZ
		try { netscape.security.PrivilegeManager.enablePrivilege("UniversalXPConnect"); }
		catch(e) { return false; } // security access denied
		var file = Components.classes["@mozilla.org/file/local;1"].createInstance(Components.interfaces.nsILocalFile);
		try { file.initWithPath(f); }
		catch(e) { return false; } // invalid directory
		return file.exists();
	}
	else if (config.browser.isIE) { // IE
		var fso = new ActiveXObject("Scripting.FileSystemObject");
		return fso.FileExists(f);
	}
	else return true; // other browsers: assume file exists
}
//}}}

//{{{
if (config.macros.attach.getAttachment==undefined) config.macros.attach.getAttachment=function(title) {

	// extract embedded data, local and remote links (if any)
	var text=store.getTiddlerText(title,'');
	var locallink=store.getTiddlerText(title+'##file','').trim();
	var remotelink=store.getTiddlerText(title+'##url','').trim();
        var pubgetlink=store.getTiddlerText(title+'##pubget','').trim();

	// if document is being served remotely, preferentially use remote URL or PubGet
        if ( document.location.protocol != "file:" ) {
          if ( remotelink.length ) return remotelink;
          if ( pubgetlink.length ) return pubgetlink;
          if ( locallink.length ) return locallink; // return without checking file existence to avoid security alert
          alert ("No usable link found!");
          return title;
          }

	// use local link if found
	if (locallink.length) { 
		locallink=locallink.replace(/^\.[\/\\]/,'');
		if ( locallink.substr(0,4) != "file" ) {
		  var pathPrefix=document.location.href;
		  var slashpos=pathPrefix.lastIndexOf("/"); if (slashpos==-1) slashpos=pathPrefix.lastIndexOf("\\"); 
		  if (slashpos!=-1 && slashpos!=pathPrefix.length-1) pathPrefix=pathPrefix.substr(0,slashpos+1);
                  locallink = pathPrefix+locallink;
                  }
               return locallink;
	}
       
	// no local (or not found), fallback to remote URL or PubGet (if any)
	if (remotelink.length) return remotelink;
        if (pubgetlink.length) return pubgetlink;

	// attachment URL doesn't resolve, just return input as is
	return title;
        }
//}}}
//{{{
if (config.macros.attach.init_formatters==undefined) config.macros.attach.init_formatters=function() {
	if (this.initialized) return;

	// find the formatter for "image" and replace the handler
	for (var i=0; i<config.formatters.length && config.formatters[i].name!="image"; i++);
	if (i<config.formatters.length)	config.formatters[i].handler=function(w) {
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) // Simple bracketted link
			{
			var e = w.output;
			if(lookaheadMatch[5])
				{
				var link = lookaheadMatch[5];
				var external=config.formatterHelpers.isExternalLink(link);
				if(external) {
                                    e = createExternalLink(w.output,link);
				  }
                               else {
                                 if (config.macros.attach.isAttachment(link))
                                   { e = createExternalLink(w.output,link);
                                     e.href=config.macros.attach.getAttachment(link);
                                     e.title = config.macros.attach.linkTooltip + link;
                                   }
                                 else {
                                   e = createTiddlyLink(w.output,link,false,null,w.isStatic);
                                   }
                                 }
				addClass(e,"imageLink");
				}
			var img = createTiddlyElement(e,"img");
			if(lookaheadMatch[1])
				img.align = "left";
			else if(lookaheadMatch[2])
				img.align = "right";
			if(lookaheadMatch[3])
				img.title = lookaheadMatch[3];
			img.src = lookaheadMatch[4];
			// ELS -------------
			if (config.macros.attach.isAttachment(lookaheadMatch[4]))
				img.src=config.macros.attach.getAttachment(lookaheadMatch[4]);
			// ELS -------------
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	}
//}}}
//{{{
	// find the formatter for "prettyLink" and replace the handler
	for (var i=0; i<config.formatters.length && config.formatters[i].name!="prettyLink"; i++);
	if (i<config.formatters.length)	{
		config.formatters[i].handler=function(w) {
			this.lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
			if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
				var e;
				var text = lookaheadMatch[1];
				if(lookaheadMatch[3]) {
					// Pretty bracketted link
					var link = lookaheadMatch[3];
					if (config.macros.attach.isAttachment(link)) {
						e = createExternalLink(w.output,link);
						e.href=config.macros.attach.getAttachment(link);
						e.title=config.macros.attach.linkTooltip+link;
					}
					else e = (!lookaheadMatch[2] && config.formatterHelpers.isExternalLink(link))
						? createExternalLink(w.output,link)
						: createTiddlyLink(w.output,link,false,null,w.isStatic);
				} else {
					e = createTiddlyLink(w.output,text,false,null,w.isStatic);
				}
				createTiddlyText(e,text);
				w.nextMatch = this.lookaheadRegExp.lastIndex;
			}
		}
	} // if "prettyLink" formatter found
	this.initialized=true;
}
//}}}
//{{{
config.macros.attach.init_formatters(); // load time init
//}}}
//{{{
if (TiddlyWiki.prototype.coreGetRecursiveTiddlerText==undefined) {
	TiddlyWiki.prototype.coreGetRecursiveTiddlerText = TiddlyWiki.prototype.getRecursiveTiddlerText;
	TiddlyWiki.prototype.getRecursiveTiddlerText = function(title,defaultText,depth) {
		return config.macros.attach.isAttachment(title)?
			config.macros.attach.getAttachment(title):this.coreGetRecursiveTiddlerText.apply(this,arguments);
	}
}
//}}}
/%
!info
|Name|AutoRefresh|
|Source|http://www.TiddlyTools.com/#AutoRefresh|
|Version|2.0.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|transclusion|
|Description|set/clear tiddler refresh flags to force/prevent re-rendering when changes occur|
Usage:
<<<
{{{
<<tiddler AutoRefresh>>
<<tiddler AutoRefresh with: mode id>>
}}}
*''mode'' (optional), one of:
**''off'' or ''disable'' - prevents refresh of rendered content (except when PageTemplate is changed!)
**''on'' or ''enable'' - re-render content whenever corresponding tiddler source is changed (default)
**''force'' - re-render content whenever //''ANY''// tiddler is changed
*''id'' (optional), is a unique DOM element identifier on which to operate (e.g., 'mainMenu').  If omitted, the current tiddler (if any) is implied.
<<<
!end
!show
<<tiddler {{
	var here=story.findContainingTiddler(place);
	var target=document.getElementById('$2')||here||place.parentNode;
	if (target==here) { // in a tiddler, get viewer element
		var elems=target.getElementsByTagName('*');
		for (var i=0;i<elems.length;i++)
			if (hasClass(elems[i],'viewer')) { target=elems[i]; break; }
	}
	if (target) {
		var mode='$1'; if (mode=='$'+'1') mode='on';
		if (['on','enable','force'].contains(mode.toLowerCase())) {
			var title=target.getAttribute('tiddler');
			if (!title&&here) title=here.getAttribute('tiddler');
			if (title) target.setAttribute('tiddler',title);
			target.setAttribute('refresh','content');
			target.setAttribute('force',(mode=='force')?'true':'');
		} else if (['off','disable'].contains(mode.toLowerCase())) {
			target.setAttribute('refresh','');
			target.setAttribute('force','');
		}
	}
'';}}>>
!end
%/<<tiddler {{var src='AutoRefresh'; src+(tiddler&&tiddler.title==src?'##info':'##show');}}
	with: [[$1]] [[$2]]>>
We propose to extend our understanding of the //in vivo// roles of the vital PCM damage-control system by examining how PCM acts to enhance long-term survival of //Escherichia coli//. We chose this model in part because the ability of the bacteria to survive long periods in a state of low metabolic activity affords ample opportunity for isoAsp-containing proteins to accumulate, increasing the need to rely on repair in order to survive.

[1<i[|wimages/growth.png]]''Long-term Stationary Phase: a Bacterial Model for Aging''. When nutrients are limiting&mdash;more often than not, in many natural environments&mdash;//E. coli// and many other bacteria maximize their potential for long-term survival of adverse conditions by entering [G[stationary phase|stat_phase]]. Once thought of as a temporary, static condition preceding the death of a saturated culture, bacteria in stationary phase&mdash;better termed long-term stationary phase&mdash;are now recognized as a dynamic community capable of surviving at least for many years with no additional nutrients###Finkel2006###. In this state, metabolism is minimized, cell division becomes infrequent, new protein synthesis is reduced, and many products are made to protect macromolecules from damage, including [G[chaperons|chaperon]], [G[trehalose]], [G[catalase]], a repair exonuclease and altered lipids###Kolter1993,Siegele1992###. Some cells multiply at the expense of others, and the community evolves as selection for favorable genetic changes occurs; although individual cells die, the population can apparently survive indefinitely###Finkel2006###.

[1>i[PCM is required for maximal survival of aging //E. coli//<br>exposed to methanol stress: compare //pcm// mutant JV1068<br>to wild-type MC1000 (Fig. 2 from Visick, 1998)|wimages/methanol.png]]Long-term stationary phase in //E. coli// effectively models many aspects of cellular aging in higher organisms:###Ackermann2003,Bjedov2003,Leslie2003,Nyström2002###
*Stationary-phase cells can be considered [G[senescent|senescence]] in that the ability of individual cells to carry out their essential life functions declines over time, as does their ability to return to normal growth even when nutrients are restored###Nyström2003,Nyström1999,Siegele1993###.
*With limited metabolism and protein synthesis, the bacteria have little opportunity to replace damaged macromolecules, and their longevity becomes strongly dependent on effective maintenance and repair###Kolter1993###.
*Consistent with the tenets of the [G[free-radical theory of aging|free_radical_theory]] in higher organisms, stationary-phase bacteria continue to produce [G[reactive oxygen species|ROS]] despite reduced metabolism###Gonzalez-Flecha1995### and exhibit increased oxidative damage as well as decreased protein function as the culture ages###Dukan1999###.
''PCM in Stationary Phase'''. We have previously shown that maximal survival of "aging" //E. coli// in long-term stationary phase is indeed dependent on PCM###Visick1998### (see figure at right), establishing a convenient model system in which to study the importance of isoAsp repair. IsoAsp damage accumulates as the culture ages###Visick1998a###, and damage is repaired by a methyltransferase extremely similar in structure and function to its orthologs throughout the living world###Fu1991,Kagan1997###. Studies of PCM in //E. coli// are thus likely to yield insights into the role of protein repair in both bacteria and higher organisms. In particular, our previous work demonstrating the importance of PCM for survival of denaturing stresses###Visick1998### and for recovery from stationary phase###Hicks2005### suggest that we will be able to investigate the basis for many of the interesting findings from other systems, including roles for PCM in longevity,###Chavous2001,Kagan1997a,Kim1997,Mudgett1996### protein conformation,###Chavous2001,Kern2005### stress responses,###Chavous2001,Mudgett1994### and recovery from dormant states.###Kagan1997a,Mudgett1993###

To learn about our current lines of investigation of these questions, see the topic [[Current Hypotheses]].
Primer design: [[Primer3|http://www.bioinformatics.nl/cgi-bin/primer3plus/primer3plus.cgi]]
[[Simple DNA manipulation|http://www.vivo.colostate.edu/molkit/manip]] (complement, reverse, etc.)
/***
|Name|CheckboxPlugin|
|Source|http://www.TiddlyTools.com/#CheckboxPlugin|
|Documentation|http://www.TiddlyTools.com/#CheckboxPluginInfo|
|Version|2.4.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|Add checkboxes to your tiddler content|
This plugin extends the TiddlyWiki syntax to allow definition of checkboxes that can be embedded directly in tiddler content.  Checkbox states are preserved by:
* by setting/removing tags on specified tiddlers,
* or, by setting custom field values on specified tiddlers,
* or, by saving to a locally-stored cookie ID,
* or, automatically modifying the tiddler content (deprecated)
When an ID is assigned to the checkbox, it enables direct programmatic access to the checkbox DOM element, as well as creating an entry in TiddlyWiki's config.options[ID] internal data.  In addition to tracking the checkbox state, you can also specify custom javascript for programmatic initialization and onClick event handling for any checkbox, so you can provide specialized side-effects in response to state changes.
!!!!!Documentation
>see [[CheckboxPluginInfo]]
!!!!!Revisions
<<<
2008.01.08 [*.*.*] plugin size reduction: documentation moved to [[CheckboxPluginInfo]]
2008.01.05 [2.4.0] set global "window.place" to current checkbox element when processing checkbox clicks.  This allows init/beforeClick/afterClick handlers to reference RELATIVE elements, including using "story.findContainingTiddler(place)".  Also, wrap handlers in "function()" so "return" can be used within handler code.
|please see [[CheckboxPluginInfo]] for additional revision details|
2005.12.07 [0.9.0] initial BETA release
<<<
!!!!!Code
***/
//{{{
version.extensions.CheckboxPlugin = {major: 2, minor: 4, revision:0 , date: new Date(2008,1,5)};
//}}}
//{{{
config.checkbox = { refresh: { tagged:true, tagging:true, container:true } };
config.formatters.push( {
	name: "checkbox",
	match: "\\[[xX_ ][\\]\\=\\(\\{]",
	lookahead: "\\[([xX_ ])(=[^\\s\\(\\]{]+)?(\\([^\\)]*\\))?({[^}]*})?({[^}]*})?({[^}]*})?\\]",
	handler: function(w) {
		var lookaheadRegExp = new RegExp(this.lookahead,"mg");
		lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			// get params
			var checked=(lookaheadMatch[1].toUpperCase()=="X");
			var id=lookaheadMatch[2];
			var target=lookaheadMatch[3];
			if (target) target=target.substr(1,target.length-2).trim(); // trim off parentheses
			var fn_init=lookaheadMatch[4];
			var fn_clickBefore=lookaheadMatch[5];
			var fn_clickAfter=lookaheadMatch[6];
			var tid=story.findContainingTiddler(w.output);  if (tid) tid=tid.getAttribute("tiddler");
			var srctid=w.tiddler?w.tiddler.title:null;
			config.macros.checkbox.create(w.output,tid,srctid,w.matchStart+1,checked,id,target,config.checkbox.refresh,fn_init,fn_clickBefore,fn_clickAfter);
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
	}
} );
config.macros.checkbox = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		if(!(tiddler instanceof Tiddler)) { // if no tiddler passed in try to find one
			var here=story.findContainingTiddler(place);
			if (here) tiddler=store.getTiddler(here.getAttribute("tiddler"))
		}
		var srcpos=0; // "inline X" not applicable to macro syntax
		var target=params.shift(); if (!target) target="";
		var defaultState=params[0]=="checked"; if (defaultState) params.shift();
		var id=params.shift(); if (id && !id.length) id=null;
		var fn_init=params.shift(); if (fn_init && !fn_init.length) fn_init=null;
		var fn_clickBefore=params.shift();
		if (fn_clickBefore && !fn_clickBefore.length) fn_clickBefore=null;
		var fn_clickAfter=params.shift();
		if (fn_clickAfter && !fn_clickAfter.length) fn_clickAfter=null;
		var refresh={ tagged:true, tagging:true, container:false };
		this.create(place,tiddler.title,tiddler.title,0,defaultState,id,target,refresh,fn_init,fn_clickBefore,fn_clickAfter);
	},
	create: function(place,tid,srctid,srcpos,defaultState,id,target,refresh,fn_init,fn_clickBefore,fn_clickAfter) {
		// create checkbox element
		var c = document.createElement("input");
		c.setAttribute("type","checkbox");
		c.onclick=this.onClickCheckbox;
		c.srctid=srctid; // remember source tiddler
		c.srcpos=srcpos; // remember location of "X"
		c.container=tid; // containing tiddler (may be null if not in a tiddler)
		c.tiddler=tid; // default target tiddler 
		c.refresh = {};
		c.refresh.container = refresh.container;
		c.refresh.tagged = refresh.tagged;
		c.refresh.tagging = refresh.tagging;
		place.appendChild(c);
		// set default state
		c.checked=defaultState;
		// track state in config.options.ID
		if (id) {
			c.id=id.substr(1); // trim off leading "="
			if (config.options[c.id]!=undefined)
				c.checked=config.options[c.id];
			else
				config.options[c.id]=c.checked;
		}
		// track state in (tiddlername|tagname) or (fieldname@tiddlername)
		if (target) {
			var pos=target.indexOf("@");
			if (pos!=-1) {
				c.field=pos?target.substr(0,pos):"checked"; // get fieldname (or use default "checked")
				c.tiddler=target.substr(pos+1); // get specified tiddler name (if any)
				if (!c.tiddler || !c.tiddler.length) c.tiddler=tid; // if tiddler not specified, default == container
				if (store.getValue(c.tiddler,c.field)!=undefined)
					c.checked=(store.getValue(c.tiddler,c.field)=="true"); // set checkbox from saved state
			} else {
				var pos=target.indexOf("|"); if (pos==-1) var pos=target.indexOf(":");
				c.tag=target;
				if (pos==0) c.tag=target.substr(1); // trim leading "|" or ":"
				if (pos>0) { c.tiddler=target.substr(0,pos); c.tag=target.substr(pos+1); }
				if (!c.tag.length) c.tag="checked";
				var t=store.getTiddler(c.tiddler);
				if (t && t.tags)
					c.checked=t.isTagged(c.tag); // set checkbox from saved state
			}
		}
		// trim off surrounding { and } delimiters from init/click handlers
		if (fn_init) c.fn_init="(function(){"+fn_init.trim().substr(1,fn_init.length-2)+"})()";
		if (fn_clickBefore) c.fn_clickBefore="(function(){"+fn_clickBefore.trim().substr(1,fn_clickBefore.length-2)+"})()";
		if (fn_clickAfter) c.fn_clickAfter="(function(){"+fn_clickAfter.trim().substr(1,fn_clickAfter.length-2)+"})()";
		c.init=true; c.onclick(); c.init=false; // compute initial state and save in tiddler/config/cookie
	},
	onClickCheckbox: function(event) {
		window.place=this;
		if (this.init && this.fn_init) // custom function hook to set initial state (run only once)
			{ try { eval(this.fn_init); } catch(e) { displayMessage("Checkbox init error: "+e.toString()); } }
		if (!this.init && this.fn_clickBefore) // custom function hook to override changes in checkbox state
			{ try { eval(this.fn_clickBefore) } catch(e) { displayMessage("Checkbox onClickBefore error: "+e.toString()); } }
		if (this.id)
			// save state in config AND cookie (only when ID starts with 'chk')
			{ config.options[this.id]=this.checked; if (this.id.substr(0,3)=="chk") saveOptionCookie(this.id); }
		if (this.srctid && this.srcpos>0 && (!this.id || this.id.substr(0,3)!="chk") && !this.tag && !this.field) {
			// save state in tiddler content only if not using cookie, tag or field tracking
			var t=store.getTiddler(this.srctid); // put X in original source tiddler (if any)
			if (t && this.checked!=(t.text.substr(this.srcpos,1).toUpperCase()=="X")) { // if changed
				t.set(null,t.text.substr(0,this.srcpos)+(this.checked?"X":"_")+t.text.substr(this.srcpos+1),null,null,t.tags);
				if (!story.isDirty(t.title)) story.refreshTiddler(t.title,null,true);
				store.setDirty(true);
			}
		}
		if (this.field) {
			if (this.checked && !store.tiddlerExists(this.tiddler))
				store.saveTiddler(this.tiddler,this.tiddler,"",config.options.txtUserName,new Date());
			// set the field value in the target tiddler
			store.setValue(this.tiddler,this.field,this.checked?"true":"false");
			// DEBUG: displayMessage(this.field+"@"+this.tiddler+" is "+this.checked);
		}
		if (this.tag) {
			if (this.checked && !store.tiddlerExists(this.tiddler))
				store.saveTiddler(this.tiddler,this.tiddler,"",config.options.txtUserName,new Date());
			var t=store.getTiddler(this.tiddler);
			if (t) {
				var tagged=(t.tags && t.tags.indexOf(this.tag)!=-1);
				if (this.checked && !tagged) { t.tags.push(this.tag); store.setDirty(true); }
				if (!this.checked && tagged) { t.tags.splice(t.tags.indexOf(this.tag),1); store.setDirty(true); }
			}
			// if tag state has been changed, update display of corresponding tiddlers (unless they are in edit mode...)
			if (this.checked!=tagged) {
				if (this.refresh.tagged) {
					if (!story.isDirty(this.tiddler)) // the TAGGED tiddler in view mode
						story.refreshTiddler(this.tiddler,null,true); 
					else // the TAGGED tiddler in edit mode (with tags field)
						config.macros.checkbox.refreshEditorTagField(this.tiddler,this.tag,this.checked);
				}
				if (this.refresh.tagging)
					if (!story.isDirty(this.tag)) story.refreshTiddler(this.tag,null,true); // the TAGGING tiddler
			}
		}
		if (!this.init && this.fn_clickAfter) // custom function hook to react to changes in checkbox state
			{ try { eval(this.fn_clickAfter) } catch(e) { displayMessage("Checkbox onClickAfter error: "+e.toString()); } }
		// refresh containing tiddler (but not during initial rendering, or we get an infinite loop!) (and not when editing container)
		if (!this.init && this.refresh.container && this.container!=this.tiddler)
			if (!story.isDirty(this.container)) story.refreshTiddler(this.container,null,true); // the tiddler CONTAINING the checkbox
		return true;
	},
	refreshEditorTagField: function(title,tag,set) {
		var tagfield=story.getTiddlerField(title,"tags");
		if (!tagfield||tagfield.getAttribute("edit")!="tags") return; // if no tags field in editor (i.e., custom template)
		var tags=tagfield.value.readBracketedList();
		if (tags.contains(tag)==set) return; // if no change needed
		if (set) tags.push(tag); // add tag
		else tags.splice(tags.indexOf(tag),1); // remove tag
		for (var t=0;t<tags.length;t++) tags[t]=String.encodeTiddlyLink(tags[t]);
		tagfield.value=tags.join(" "); // reassemble tag string (with brackets as needed)
		return;
	}
}
//}}}
!!How it works
Homologous recombination can occur between any two identical or nearly identical DNA sequences; this is the same basic process as crossing-over in meiosis. Homologous recombination can be used to introduce a gene into the bacterial chromosome. A gene on a plasmid will generally not recombine with the chromosome; however, if a plasmid that is unable to replicate independently is introduced into a bacterial cell, plasmid-encoded genes can only persist if recombination occurs. If the plasmid has selectable genes, even a rare recombination event can be identified in a large bacterial population.

We use pKAS46###Skorupski1996### (or pKAS32, which is very similar but lacks a kanamycin-resistance gene) as a vector for recombining sequences into the //E. coli// chromosome. This plasmid has a multiple cloning site where a gene of interest can be inserted, ampicillin- and kanamycin-resistance genes, and the //rpsL// gene, encoding the wild-type allele of a particular ribosomal protein. Cells carrying this allele are __sensitive__ to streptomycin, which binds RpsL. Its origin (R6K) requires the Pir protein in order to be replicated; however, pKAS46 lacks the //pir// gene, so it can only replicate in a host strain that includes the //pir// gene.
[0i[wimages/repl.png]]
Suppose we want to replace a chromosomal gene with a deleted version (one missing an internal segment). The deleted gene is cloned into pKAS46, using a //pir//^^+^^ host such as CC118&lambda;. The plasmid is then transformed into a streptomycin-resistant //pir//^^&ndash;^^ strain, where it cannot replicate. The cells are plated on plates containing either ampicillin or kanamycin, which selects for the resistance genes on the plasmid. Since the plasmid can't replicate, any resistant colonies must contain an integrated copy of the plasmid (due to a single crossover event), resulting in a duplication of the gene of interest. These bacteria will be Str^^S^^ due to the plasmid-encoded //rpsL//^^+^^. Now, the bacteria can be plated on a streptomycin-containing medium; those that grow will have lost the vector sequences due to a second recombination event between the two copies of the gene of interest.

Notice that we were able to //select// for integration of the plasmid (using Ap or Km) and then select //again// for the second crossover. This makes it much easier to find the cells where the desired recombination took place.
!!Procedure
*Electroporate the desired //str//^^R^^ strain with pKAS46 containing the gene of interest.
*Plate transformants on LB agar containing 50 &mu;g/ml kanamycin //or// 50 &mu;g/ml ampicillin.
*Patch transformants on the same antibiotic to ensure that only resistant cells have been isolated.
*Grow several colonies (separately) in 3 ml LB cultures overnight at 37&deg;C with shaking.
*Dilute each culture 1:1000 in fresh LB and again grow overnight.
>This non-selective growth allows time for the second recombination event (if we added antibiotic here, it would force the cells to keep the whole integrated plasmid).
*Streak a loopful from each culture on LB agar containing 1 mg/ml streptomycin.
*From each streak, choose some colonies that grew well on streptomycin and restreak on streptomycin.
*Choose colonies from each streak that grow well and patch on LB, LB + streptomycin, LB + ampicillin and LB + kanamycin
*Choose colonies that are clearly Str^^R^^, Ap^^S^^ and Km^^S^^ and test for the desired chromosomal insert by PCR, using primers JV11 and JV14.
}}}
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #eee
PrimaryMid: #686B6E
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
{{proctxt{
!!How it works
The main problem in preparing bacteria for electroporation is washing them sufficiently to remove any media or buffers that will lower the electrical resistance&mdash;if the solution the cells are in contains ions, the electric pulse will simply flow through the solution, not the cells. Multiple wash and resuspension steps also increase the risk of damaging the fragile competent cells (remember, they're under osmotic stress once the medium is washed off!). There are many procedures for making electrocompetent cells; this particular variation begins by growing cells in [[salt-free LB broth|Salt-free LB broth]] so that fewer wash steps will be needed. In addition, this procedure concentrates cells into a glycerol-containing buffer suitable for freezing.
!!Materials
{{proctab{
|[[Salt-free LB broth]]| 250 ml per strain|
|Ice-cold, sterile 10% glycerol in [[1 mM HEPES|HEPES (1 mM)]]| 500 &mu;l per strain|
|Ice-cold, sterile dH~~2~~O| 250 ml per strain|
|Sterile 250-ml centrifuge bottle (pre-chilled)| 1 per strain|
|Sterile 1.5-ml microcentrifuge tubes (pre-chilled)| 1 per strain|
|Sterile 1-l culture flask| 1 per strain|
}}}
!!Procedure###Calvin1988######Michelsen1995######Visalli1993###```<html><a href="docs/MicroPulser.pdf" target="_blank">MicroPulser electroporator instruction manual</a></html>```
* Grow a 5-ml overnight culture of the desired recipient strain in salt-free LB broth.
* Dilute 1:100 in 250 ml of salt-free LB broth in a 1-liter flask
* Grow with aeration to OD~~600~~ = 0.5 to 0.7```Best results are obtained with early- to mid-log phase cells.```.
* Pour into pre-chilled, sterile 250-ml centrifuge bottle and chill in ice-water bath for 45 min. ''Keep cells as close to 0&deg;C as possible throughout the procedure.''
* Pre-chill centrifuge and rotor to 2&deg;C.
* Centrifuge 5 min. at 4000 &times; //g// and 2&deg;C. Remove supernatant completely, even if a few cells are sacrificed.
* Resuspend gently but completely in 250 ml ice-cold sterile dH~~2~~O ''by swirling bottle in ice-water bath''. (This typically takes at least 15 minutes.)
* Once resuspended, let stand in ice-water bath 10 min more.
* Centrifuge 5 min. at 4000 &times; //g// and 2&deg;C.
* Resuspend gently but completely in 500 &mu;l ice-cold sterile 1 mM HEPES with 10% glycerol by swirling in ice-water bath and/or gently swirling with a pre-chilled pipette tip. Final volume will probably be 1-1.5 ml.
* Transfer 50-&mu;l aliquots to microcentrifuge tubes in a dry ice or liquid nitrogen bath```It's important that the cells freeze immediately. If a dry ice or liquid nitrogen bath is not available, pre-chill the microcentrifuge tubes in the -80&deg;C freezer and then quickly aliquot the cells.``` and store```Frozen competent cells are stable for six months or more.``` frozen aliquots at &ndash;80&deg;C.
}}}
/***
|Name|CopyTiddlerPlugin|
|Source|http://www.TiddlyTools.com/#CopyTiddlerPlugin|
|Version|3.2.5|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.3|
|Type|plugin|
|Description|Quickly create a copy of any existing tiddler|
!!!Usage
<<<
The plugin automatically updates the default (shadow) ToolbarCommands definitions to insert the ''copyTiddler'' command, which will appear as ''copy'' when a tiddler is rendered.  If you are already using customized toolbar definitions, you will need to manually add the ''copyTiddler'' toolbar command to your existing ToolbarCommands tiddler, e.g.:
{{{
|EditToolbar|... copyTiddler ... |
}}}
When the ''copy'' command is selected, a new tiddler is created containing an exact copy of the current text/tags/fields, using a title of "{{{TiddlerName (n)}}}", where ''(n)'' is the next available number (starting with 1, of course).  If you copy while //editing// a tiddler, the current values displayed in the editor are used (including any changes you may have already made to those values), and the new tiddler is immediately opened for editing.

The plugin also provides a macro that allows you to embed a ''copy'' command directly in specific tiddler content:
{{{
<<copyTiddler TidderName label:"..." prompt:"...">>
}}}
where
* ''TiddlerName'' (optional)<br>specifies the //source// tiddler to be copied.  If omitted, the current containing tiddler (if any) will be copied.
* ''label:"..."'' (optional)<br>specifies text to use for the embedded link (default="copy TiddlerName")
* ''prompt:"..."'' (optional)<br>specifies mouseover 'tooltip' help text for link
//Note: to use non-default label/prompt values with the current containing tiddler, use "" for the TiddlerName//
<<<
!!!Configuration
<<<
<<option chkCopyTiddlerDate>> use date/time from existing tiddler (otherwise, use current date/time)
{{{<<option chkCopyTiddlerDate>>}}}
<<<
!!!Revisions
<<<
2009.06.08 [3.2.5] added option to use timestamp from source tiddler
2009.03.09 [3.2.4] fixed IE-specific syntax error
2009.03.02 [3.2.3] refactored code (again) to restore use of config.commands.copyTiddler.* custom settings
2009.02.13 [3.2.2] in click(), fix calls to displayTiddler() to use current tiddlerElem and use getTiddlerText() to permit copying of shadow tiddler content
2009.01.30 [3.2.1] fixed handling for copying field values when in edit mode
2009.01.23 [3.2.0] refactored code and added {{{<<copyTiddler TiddlerName>>}}} macro
2008.12.18 [3.1.4] corrected code for finding next (n) value when 'sparse' handling is in effect (thanks to RussThomas for identifying and diagnosing the problem)
2008.11.14 [3.1.3] added optional 'sparse' setting (avoids 'filling in' missing numbers that may have been previously deleted)
2008.11.14 [3.1.2] added optional 'zeroPad' setting
2008.11.14 [3.1.1] moved hard-coded '(n)' regex into 'suffixPattern' object property so it can be customized
2008.09.26 [3.1.0] changed new title generation to use '(n)' suffix instead of 'Copy of' prefix
2008.05.20 [3.0.3] in handler, when copying from VIEW mode, create duplicate array from existing tags array before saving new tiddler.
2007.12.19 [3.0.2] in handler, when copying from VIEW mode, duplicate custom fields before saving new tiddler. Thanks to bug report from Ken Girard.
2007.09.26 [3.0.1] in handler, use findContainingTiddler(src) to get tiddlerElem (and title).  Allows 'copy' command to find correct tiddler when transcluded using {{{<<tiddler>>}}} macro or enhanced toolbar inclusion (see [[CoreTweaks]])
2007.06.28 [3.0.0] complete re-write to handle custom fields and alternative view/edit templates
2007.05.17 [2.1.2] use store.getTiddlerText() to retrieve tiddler content, so that SHADOW tiddlers can be copied correctly when in VIEW mode
2007.04.01 [2.1.1] in copyTiddler.handler(), fix check for editor fields by ensuring that found field actually has edit=='text' attribute
2007.02.05 [2.1.0] in copyTiddler.handler(), if editor fields (textfield and/or tagsfield) can't be found (i.e., tiddler is in VIEW mode, not EDIT mode), then get text/tags values from stored tiddler instead of active editor fields.  Allows use of COPY toolbar directly from VIEW mode (based on a request from LaurentCharles)
2006.12.12 [2.0.0] completely rewritten so plugin just creates a new tiddler EDITOR with a copy of the current tiddler EDITOR contents, instead of creating the new tiddler in the STORE by copying the current tiddler values from the STORE.
2005.xx.xx [1.0.0] original version by Tim Morgan
<<<
!!!Code
***/
//{{{
version.extensions.CopyTiddlerPlugin= {major: 3, minor: 2, revision: 5, date: new Date(2009,6,8)};

// automatically tweak shadow EditTemplate to add 'copyTiddler' toolbar command (following 'cancelTiddler')
config.shadowTiddlers.ToolbarCommands=config.shadowTiddlers.ToolbarCommands.replace(/cancelTiddler/,'cancelTiddler copyTiddler');

if (config.options.chkCopyTiddlerDate===undefined) config.options.chkCopyTiddlerDate=false;

config.commands.copyTiddler = {
	text: 'copy',
	hideReadOnly: true,
	tooltip: 'Make a copy of this tiddler',
	notitle: 'this tiddler',
	prefix: '',
	suffixText: ' (%0)',
	suffixPattern: / \(([0-9]+)\)$/,
	zeroPad: 0,
	sparse: false,
	handler: function(event,src,title)
		{ return config.commands.copyTiddler.click(src,event); },
	click: function(here,ev) {
		var tiddlerElem=story.findContainingTiddler(here);
		var template=tiddlerElem?tiddlerElem.getAttribute('template'):null;
		var title=here.getAttribute('from');
		if (!title || !title.length) {
			if (!tiddlerElem) return false;
			else title=tiddlerElem.getAttribute('tiddler');
		}
		var root=title.replace(this.suffixPattern,''); // title without suffix
		// find last matching title
		var last=title;
		if (this.sparse) { // don't fill-in holes... really find LAST matching title
			var tids=store.getTiddlers('title','excludeLists');
			for (var t=0; t<tids.length; t++) if (tids[t].title.startsWith(root)) last=tids[t].title;
		}
		// get next number (increment from last matching title)
		var n=1; var match=this.suffixPattern.exec(last); if (match) n=parseInt(match[1])+1;
		var newTitle=this.prefix+root+this.suffixText.format([String.zeroPad(n,this.zeroPad)]);
		// if not sparse mode, find the next hole to fill in...
		while (store.tiddlerExists(newTitle)||document.getElementById(story.idPrefix+newTitle))
			{ n++; newTitle=this.prefix+root+this.suffixText.format([String.zeroPad(n,this.zeroPad)]); }
		if (!story.isDirty(title)) { // if tiddler is not being EDITED
			// duplicate stored tiddler (if any)
			var text=store.getTiddlerText(title,'');
			var who=config.options.txtUserName;
			var when=new Date();
			var newtags=[]; var newfields={};
			var tid=store.getTiddler(title); if (tid) {
				if (config.options.chkCopyTiddlerDate) var when=tid.modified;
				for (var t=0; t<tid.tags.length; t++) newtags.push(tid.tags[t]);
				store.forEachField(tid,function(t,f,v){newfields[f]=v;},true);
			}
	                store.saveTiddler(newTitle,newTitle,text,who,when,newtags,newfields,true);
			story.displayTiddler(tiddlerElem,newTitle,template);
		} else {
			story.displayTiddler(tiddlerElem,newTitle,template);
			var fields=config.commands.copyTiddler.gatherFields(tiddlerElem); // get current editor fields
			var newTiddlerElem=document.getElementById(story.idPrefix+newTitle);
			for (var f=0; f<fields.length; f++) {  // set fields in new editor
				if (fields[f].name=='title') fields[f].value=newTitle; // rename title in new tiddler
				var fieldElem=config.commands.copyTiddler.findField(newTiddlerElem,fields[f].name);
				if (fieldElem) {
					if (fieldElem.getAttribute('type')=='checkbox')
						fieldElem.checked=fields[f].value;
					else 
						fieldElem.value=fields[f].value;
				}
			}
		}
		story.focusTiddler(newTitle,'title');
		return false;
	},
	findField: function(tiddlerElem,field) {
		var inputs=tiddlerElem.getElementsByTagName('input');
		for (var i=0; i<inputs.length; i++) {
			if (inputs[i].getAttribute('type')=='checkbox' && inputs[i].field == field) return inputs[i];
			if (inputs[i].getAttribute('type')=='text' && inputs[i].getAttribute('edit') == field) return inputs[i];
		}
		var tas=tiddlerElem.getElementsByTagName('textarea');
		for (var i=0; i<tas.length; i++) if (tas[i].getAttribute('edit') == field) return tas[i];
		var sels=tiddlerElem.getElementsByTagName('select');
		for (var i=0; i<sels.length; i++) if (sels[i].getAttribute('edit') == field) return sels[i];
		return null;
	},
	gatherFields: function(tiddlerElem) { // get field names and values from current tiddler editor
		var fields=[];
		// get checkboxes and edit fields
		var inputs=tiddlerElem.getElementsByTagName('input');
		for (var i=0; i<inputs.length; i++) {
			if (inputs[i].getAttribute('type')=='checkbox')
				if (inputs[i].field) fields.push({name:inputs[i].field,value:inputs[i].checked});
			if (inputs[i].getAttribute('type')=='text')
				if (inputs[i].getAttribute('edit')) fields.push({name:inputs[i].getAttribute('edit'),value:inputs[i].value});
		}
		// get textareas (multi-line edit fields)
		var tas=tiddlerElem.getElementsByTagName('textarea');
		for (var i=0; i<tas.length; i++)
			if (tas[i].getAttribute('edit')) fields.push({name:tas[i].getAttribute('edit'),value:tas[i].value});
		// get selection lists (droplist or listbox)
		var sels=tiddlerElem.getElementsByTagName('select');
		for (var i=0; i<sels.length; i++)
			if (sels[i].getAttribute('edit')) fields.push({name:sels[i].getAttribute('edit'),value:sels[i].value});
		return fields;
	}
};
//}}}
// // MACRO DEFINITION
//{{{
config.macros.copyTiddler = {
	label: 'copy',
	prompt: 'Make a copy of %0',
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var title=params.shift();
		params=paramString.parseParams('anon',null,true,false,false);
		var label	=getParam(params,'label',this.label+(title?' '+title:''));
		var prompt	=getParam(params,'prompt',this.prompt).format([title||this.notitle]);
		var b=createTiddlyButton(place,label,prompt,
			function(ev){return config.commands.copyTiddler.click(this,ev)});
		b.setAttribute('from',title||'');
	}
};
//}}}
/%
|Name|CreateTiddlersFromCSV|
|Source|http://www.TiddlyTools.com/#CreateTiddlersFromCSV|
|Version|1.3.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|html|
|Description|create tiddlers from CSV data|

!FORMAT
<<<
~Comma-Separated Value (CSV) format:
{{{
title,created,modified,modifier,tags,text,customfield1,customfield2,...
MyTiddler,04/25/2009,04/25/2009,YourName,tag1 [[tag 2]] tag3,"This is ""quoted"" content, with a comma",value,value,...
}}}
{{wrap{
''The first line contains lower-case field names and must include a //"title"// field''.  Subsequent lines define //~CSV-encoded// data: any values that contain quotes or commas are surrounded by double-quotes, and quotes occuring //within// the values are doubled-up.  The ''tags'' field is entered as a //space-separated bracketed list//. Additional fieldnames ("fieldN") are added as custom tiddler fields.}}}
<<<
!end

REVISIONS:
[1.3.1] remove debugging message
[1.3.0] correct handling for embedded quotes and strip \r from input
[1.2.0] convert created/modified values from strings to date objects
[1.1.0] handle CSV-encoded embedded commas and quotes

%/<<tiddler HideTiddlerTags>>{{small smallform{
Enter/paste<<slider {{config.options['']=false;'';}}
	[[CreateTiddlersFromCSV##FORMAT]] 'CSV-formatted data...' 'view CSV format description'
>> or, read data from a tiddler: <html><nowiki>
	<form style='display:inline;margin:0;padding:0;white-space:normal;'>
	<select class='editor' name='tid' title='select a tiddler title'>
	<option>select a tiddler title...</option>
	</select>
	<input type='button' value='get data'
		onclick="this.form.src.value=store.getTiddlerText(this.form.tid.value,'')">
	<input type='button' value='create tiddlers' onclick="
		var CSV=this.form.src.value;
		// GET NAMES
		var lines=CSV.replace(/\r/g,'').split('\n');
		var names=lines.shift().replace(/\x22/g,'').split(',');
		CSV=lines.join('\n');
		// ENCODE commas and newlines within quoted values
		var comma='!~comma~!'; var commaRE=new RegExp(comma,'g');
		var newline='!~newline~!'; var newlineRE=new RegExp(newline,'g');
		CSV=CSV.replace(/\x22([^\x22]*?)\x22/g, function(x){ return x.replace(/\,/g,comma).replace(/\n/g,newline); });
		var lines=CSV.split('\n'); var count=0;
		for (var i=0; i<lines.length; i++) { if (!lines[i].length) continue;
			var values=lines[i].split(',');
			// DECODE commas, newlines, and doubled-quotes, and remove enclosing quotes (if any)
			for (var j=0; j<values.length; j++)
				values[j]=values[j].replace(commaRE,',').replace(newlineRE,'\n')
					.replace(/^\x22|\x22$/g,'').replace(/\x22\x22/g,'\x22');
			// EXTRACT tiddler values
			var title=''; var text=''; var tags=[]; var fields={};
			var created=null; var when=new Date(); var who=config.options.txtUserName;
			for (var v=0; v<values.length; v++) { var val=values[v];
				if (names[v]) switch(names[v].toLowerCase()) {
					case 'title':	title=val.replace(/\[\]\|/g,'_'); break;
					case 'created': created=new Date(val); break;
					case 'modified':when=new Date(val); break;
					case 'modifier':who=val; break;
					case 'text':	text=val; break;
					case 'tags':	tags=val.readBracketedList(); break;
					default:	fields[names[v].toLowerCase()]=val; break;
				}
			}
			if (title.length) {
				store.saveTiddler(title,title,text,who,when,tags,fields,true,created||when);
				displayMessage('Created '+title);
				count++;
			}
			else if (!confirm('invalid data on line '+i+': missing/blank TiddlerName\n\n'
				+values.join('\n')+'\n\n\OK=skip, CANCEL=stop')) break;
		}
		displayMessage('Created '+count+' tiddlers');
	"><br><textarea class='editor' name='src' style='display:inline;width:100%;height:10em;'></textarea>
	</form>
</html><<tiddler {{
	var list=place.lastChild.getElementsByTagName('form')[0].tid;
	store.forEachTiddler(function(title,tiddler){
		list.options[list.length]=new Option(title,title);
	});
'';}}>>}}}
[[PCM|Protein Repair and PCM]] repairs proteins damaged by spontaneous formation of [G[isoAsp|isoasp]] at labile [G[Asp|asp]] or [G[Asn|asn]] sites. This key form of [G[covalent protein damage|covalent_damage]] has received increasing attention as intriguing connections to a variety of diseases and pathological conditions have been uncovered (see [[PCM vs Aging and Disease]]). While the ability of PCM to specifically methylate isoAsp sites###Mudgett1993### and to restore function to damaged proteins //in vitro//###Clarke1992### have been clearly demonstrated, ''how'', ''where'' and ''when'' this enzyme acts //in vivo// to protect cells from the effects of isoAsp damage and organisms from aging and degenerative disease remains poorly understood.

Our laboratory seeks to better understand the roles of PCM-mediated repair //in vivo//, using long-term [G[stationary phase|stat_phase]] in //Escherichia coli// as a [[model system|Bacterial Aging]]. We are testing two specific hypotheses and addressing key open questions about PCM functions //in vivo//:
#''How'' does PCM enhance long-term survival in //E. coli//: by repairing active-site residues? by maintaining protein conformation? by mitigating effects of oxidative or other damage? by acting on a small number of key substrates or more generally?
#''When'' does PCM act to repair damaged proteins: continuously as damage occurs? or at specific times during aging or recovery?
#''Where'' in the cell or population does PCM exert its effect: only in the cytoplasm, or in other compartments as well? in all cells of the population or only in selected subpopulations?
Our recent results suggest two major hypotheses which form the framework for our current research:
*''Hypothesis 1'': isoAsp damage has a synergistic effect in combination with oxidative or other stresses, destabilizing the conformation of cellular proteins or inhibiting their re-folding once unfolded (see figure below).
[0i[isoAsp damage could de-stabilize protein structure,<br>making the damaged protein more susceptible to unfolding by denaturing stresses|wimages/hyp1.png]]
*[0>i[Model suggesting that PCM might act primarily in<br>metabolically active subpopulations of stationary-phase //E. coli//<br>and/or in recovering cells|wimages/hyp2.png]]''Hypothesis 2'': PCM is advantageous primarily after restoration of nutrients allows aged //E. coli// cultures to resume metabolic activity, as well as in subpopulations that are active at any given point during long-term stationary phase (modeled in the figure at right).
The other topics in this section give detailed discussions of the rationales behind these two hypotheses. The [[Specific Aims]] page summarizes how we propose to go about testing them. The [[Projects]] page lists specific research projects related to each hypothesis.
{{break{&nbsp;}}}
[1<I[Sarah Ahn|pimages/ahn.png]]''Sarah Ahn'' is working on [G[persisters|persisters]]###Lewis2010###[L[http://microbewiki.kenyon.edu/index.php/Persister_cells]]&mdash;metabolically inactive, antibiotic-tolerant sub-populations of cells. She is interested in finding out whether PCM-mediated repair might be impaired in persister cells, or whether PCM might be important in recovery from the persister state. Sarah plans to go on to graduate school and a research career.
{{break{&nbsp;}}}[1<I[Caila Byrd|pimages/byrd.png]]''Caila Byrd'' is learning DNA techniques while attempting to construct vectors for regulated expression of genes from the bacterial chromosome. She hopes to use these vectors to study the ability of //pcm// mutants to compete with wild-type cells. Caila plans a career in research or medicine.
{{break{&nbsp;}}}[1<I[Katelyn DeRosa|pimages/derosa.png]]''Katelyn DeRosa'' is studying protein oxidation. Because //pcm// mutants show increased susceptibility to oxidative stress, she wants to investigate whether proteins in the mutant cells accumulate increased oxidative damage as well as isoaspartyl damage, or whether oxidative changes may facilitate isoaspartyl formation. Katelyn currently plans a career in a health field.
{{break{&nbsp;}}}[1<I[Rose Forg??|pimages/forg.png]]''Rose Forg'' has a love for instrumental analysis and is attempting to establish a protocol for the measurement of PCM activity and isoaspartyl damage using capillary electrophoresis (CE). The CE instrument would be used to measure the conversion of [G[SAM|SAM]] to [G[SAH|SAH]] when PCM methylates an isoAsp. Rose is considering a medical career.
{{break{&nbsp;}}}[1<I[Erin Hinckley|pimages/hinckley.png]]''Erin Hinckley'' is examining the interaction of PCM with other protein maintenance systems in the cell. Specifically, she is looking at whether cells that lack heat and osmotic stress protectants such as [G[trehalose|trehalose]] and [G[betaine|betaine]] will be more drastically affected by a //pcm// mutation. After graduation, Erin hopes to go to medical school and become a physician.
{{break{&nbsp;}}}[1<I[Tori Winslow|pimages/winslow.png]]''Tori Winslow'' is investigating increased protein aggregation in //pcm// mutants, evidence that PCM participates in maintenance of protein folding. She is investigating whether a fluorescently tagged aggregate-binding protein can serve as a reporter of this increased aggregation. Tori plans a career in research.
{{break{&nbsp;}}}[1<I[Jon Visick with Toni Thomas|pimages/visick.png]]''Jon Visick'' got started studying PCM as a post-doc in the laboratory of [[Dr. Steve Clarke|http://www.biochemistry.ucla.edu/biochem/Faculty/SClarke]] at UCLA. He mentors the undergraduate researchers and tries to keep the lab running. He also teaches genetics, microbiology, immunology/virology, bioinformatics and introductory biology. He has an undergraduate degree from Brigham Young University and a PhD from the University of Washington.
{{break{&nbsp;}}}
<<tabs txtMainTab
"System" "System tiddlers" CustomTabs##system
"Protocols" "Protocols" CustomTabs##protocols
"Lists" "Lists" CustomTabs##lists
"Data" "Supporting data" CustomTabs##data
"Shadow" "Shadow tiddlers" TabMoreShadowed
"Tags" "All tags" TabTags
"All" "All tiddlers" CustomTabs##all
"Missing" "All missing tiddlers" TabMoreMissing
>>

/%
!all
{{col4{
<<forEachTiddler
sortBy 'tiddler.title.toUpperCase()'
write '"[["+tiddler.title+"]]\n"'
>>
}}}
!other
{{col4{
<<forEachTiddler
where '!tiddler.tags.containsAny(["systemConfig","sys", "protocol"])'
sortBy 'tiddler.title'
write '"[["+tiddler.title+"]]\n"'
>>
}}}
!system
{{col3{
<<forEachTiddler
where 'tiddler.tags.contains("systemConfig")'
sortBy 'tiddler.title.toUpperCase()'
write '"[["+tiddler.title+"]]\n"'
>>
}}}
{{col3{
<<forEachTiddler
where 'tiddler.tags.contains("sys")'
sortBy 'tiddler.title.toUpperCase()'
write '"[["+tiddler.title+"]]\n"'
>>
}}}
!protocols
{{col3{
<<forEachTiddler
where 'tiddler.tags.contains("protocol")'
sortBy 'tiddler.title.toUpperCase()'
write '"[["+tiddler.title+"]]\n"'
>>
}}}
!lists
{{col2{
<<forEachTiddler
where 'tiddler.tags.contains("list")'
sortBy 'tiddler.title.toUpperCase()'
write '"[[" + tiddler.title + "]]\n"'
>>
}}}
!data
{{col2{
<<forEachTiddler
where 'tiddler.tags.contains("data")'
sortBy 'tiddler.title.toUpperCase()'
write '"[["+tiddler.title+"]]\n"'
>>
}}}
!end
%/
/***
|''Name:''|DataTiddlerPlugin|
|''Version:''|1.0.6 (2006-08-26)|
|''Source:''|http://tiddlywiki.abego-software.de/#DataTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|
!Description
Enhance your tiddlers with structured data (such as strings, booleans, numbers, or even arrays and compound objects) that can be easily accessed and modified through named fields (in JavaScript code).

Such tiddler data can be used in various applications. E.g. you may create tables that collect data from various tiddlers. 

''//Example: "Table with all December Expenses"//''
{{{
<<forEachTiddler
    where
        'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'
    write
        '"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\n"'
>>
}}}
//(This assumes that expenses are stored in tiddlers tagged with "expense".)//
<<forEachTiddler
    where
        'tiddler.tags.contains("expense") && tiddler.data("month") == "Dec"'
    write
        '"|[["+tiddler.title+"]]|"+tiddler.data("descr")+"| "+tiddler.data("amount")+"|\n"'
>>
For other examples see DataTiddlerExamples.




''Access and Modify Tiddler Data''

You can "attach" data to every tiddler by assigning a JavaScript value (such as a string, boolean, number, or even arrays and compound objects) to named fields. 

These values can be accessed and modified through the following Tiddler methods:
|!Method|!Example|!Description|
|{{{data(field)}}}|{{{t.data("age")}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|
|{{{data(field,defaultValue)}}}|{{{t.data("isVIP",false)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|
|{{{data()}}}|{{{t.data()}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|
|{{{setData(field,value)}}}|{{{t.setData("age",42)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|
|{{{setData(field,value,defaultValue)}}}|{{{t.setData("isVIP",flag,false)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|

Alternatively you may use the following functions to access and modify the data. In this case the tiddler argument is either a tiddler or the name of a tiddler.
|!Method|!Description|
|{{{DataTiddler.getData(tiddler,field)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined {{{undefined}}} is returned.|
|{{{DataTiddler.getData(tiddler,field,defaultValue)}}}|Returns the value of the given data field of the tiddler. When no such field is defined or its value is undefined the defaultValue is returned.|
|{{{DataTiddler.getDataObject(tiddler)}}}|Returns the data object of the tiddler, with a property for every field. The properties of the returned data object may only be read and not be modified. To modify the data use DataTiddler.setData(...) or the corresponding Tiddler method.|
|{{{DataTiddler.setData(tiddler,field,value)}}}|Sets the value of the given data field of the tiddler to the value. When the value is {{{undefined}}} the field is removed.|
|{{{DataTiddler.setData(tiddler,field,value,defaultValue)}}}|Sets the value of the given data field of the tiddler to the value. When the value is equal to the defaultValue no value is set (and the field is removed).|
//(For details on the various functions see the detailed comments in the source code.)//


''Data Representation in a Tiddler''

The data of a tiddler is stored as plain text in the tiddler's content/text, inside a "data" section that is framed by a {{{<data>...</data>}}} block. Inside the data section the information is stored in the [[JSON format|http://www.crockford.com/JSON/index.html]]. 

//''Data Section Example:''//
{{{
<data>{"isVIP":true,"user":"John Brown","age":34}</data>
}}}

The data section is not displayed when viewing the tiddler (see also "The showData Macro").

Beside the data section a tiddler may have all kind of other content.

Typically you will not access the data section text directly but use the methods given above. Nevertheless you may retrieve the text of the data section's content through the {{{DataTiddler.getDataText(tiddler)}}} function.


''Saving Changes''

The "setData" methods respect the "ForceMinorUpdate" and "AutoSave" configuration values. I.e. when "ForceMinorUpdate" is true changing a value using setData will not affect the "modifier" and "modified" attributes. With "AutoSave" set to true every setData will directly save the changes after a setData.


''Notifications''

No notifications are sent when a tiddler's data value is changed through the "setData" methods. 

''Escape Data Section''
In case that you want to use the text {{{<data>}}} or {{{</data>}}} in a tiddler text you must prefix the text with a tilde ('~'). Otherwise it may be wrongly considered as the data section. The tiddler text {{{~<data>}}} is displayed as {{{<data>}}}.


''The showData Macro''

By default the data of a tiddler (that is stored in the {{{<data>...</data>}}} section of the tiddler) is not displayed. If you want to display this data you may used the {{{<<showData ...>>}}} macro:

''Syntax:'' 
|>|{{{<<}}}''showData '' [''JSON''] [//tiddlerName//] {{{>>}}}|
|''JSON''|By default the data is rendered as a table with a "Name" and "Value" column. When defining ''JSON'' the data is rendered in JSON format|
|//tiddlerName//|Defines the tiddler holding the data to be displayed. When no tiddler is given the tiddler containing the showData macro is used. When the tiddler name contains spaces you must quote the name (or use the {{{[[...]]}}} syntax.)|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|


!Revision history
* v1.0.6 (2006-08-26) 
** Removed misleading comment
* v1.0.5 (2006-02-27) (Internal Release Only)
** Internal
*** Make "JSLint" conform
* v1.0.4 (2006-02-05)
** Bugfix: showData fails in TiddlyWiki 2.0
* v1.0.3 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.2 (2005-12-22)
** Enhancements:
*** Handle texts "<data>" or "</data>" more robust when used in a tiddler text or as a field value.
*** Improved (JSON) error messages.
** Bugs fixed: 
*** References are not updated when using the DataTiddler.
*** Changes to compound objects are not always saved.
*** "~</data>" is not rendered correctly (expected "</data>")
* v1.0.1 (2005-12-13)
** Features: 
*** The showData macro supports an optional "tiddlername" argument to specify the tiddler containing the data to be displayed
** Bugs fixed: 
*** A script immediately following a data section is deleted when the data is changed. (Thanks to GeoffS for reporting.)
* v1.0.0 (2005-12-12)
** initial version

!Code
***/
//{{{
//============================================================================
//============================================================================
//                           DataTiddlerPlugin
//============================================================================
//============================================================================

// Ensure that the DataTiddler Plugin is only installed once.
//
if (!version.extensions.DataTiddlerPlugin) {



version.extensions.DataTiddlerPlugin = {
    major: 1, minor: 0, revision: 6,
    date: new Date(2006, 7, 26), 
    type: 'plugin',
    source: "http://tiddlywiki.abego-software.de/#DataTiddlerPlugin"
};

// For backward compatibility with v1.2.x
//
if (!window.story) window.story=window; 
if (!TiddlyWiki.prototype.getTiddler) {
	TiddlyWiki.prototype.getTiddler = function(title) { 
		var t = this.tiddlers[title]; 
		return (t !== undefined && t instanceof Tiddler) ? t : null; 
	};
}

//============================================================================
// DataTiddler Class
//============================================================================

// ---------------------------------------------------------------------------
// Configurations and constants 
// ---------------------------------------------------------------------------

function DataTiddler() {
}

DataTiddler = {
    // Function to stringify a JavaScript value, producing the text for the data section content.
    // (Must match the implementation of DataTiddler.parse.)
    //
    stringify : null,
    

    // Function to parse the text for the data section content, producing a JavaScript value.
    // (Must match the implementation of DataTiddler.stringify.)
    //
    parse : null
};

// Ensure access for IE
window.DataTiddler = DataTiddler;

// ---------------------------------------------------------------------------
// Data Accessor and Mutator
// ---------------------------------------------------------------------------


// Returns the value of the given data field of the tiddler.
// When no such field is defined or its value is undefined
// the defaultValue is returned.
// 
// @param tiddler either a tiddler name or a tiddler
//
DataTiddler.getData = function(tiddler, field, defaultValue) {
    var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
    if (!(t instanceof Tiddler)) {
        throw "Tiddler expected. Got "+tiddler;
    }

    return DataTiddler.getTiddlerDataValue(t, field, defaultValue);
};


// Sets the value of the given data field of the tiddler to
// the value. When the value is equal to the defaultValue
// no value is set (and the field is removed)
//
// Changing data of a tiddler will not trigger notifications.
// 
// @param tiddler either a tiddler name or a tiddler
//
DataTiddler.setData = function(tiddler, field, value, defaultValue) {
    var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
    if (!(t instanceof Tiddler)) {
        throw "Tiddler expected. Got "+tiddler+ "("+t+")";
    }

    DataTiddler.setTiddlerDataValue(t, field, value, defaultValue);
};


// Returns the data object of the tiddler, with a property for every field.
//
// The properties of the returned data object may only be read and
// not be modified. To modify the data use DataTiddler.setData(...) 
// or the corresponding Tiddler method.
//
// If no data section is defined a new (empty) object is returned.
//
// @param tiddler either a tiddler name or a Tiddler
//
DataTiddler.getDataObject = function(tiddler) {
    var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
    if (!(t instanceof Tiddler)) {
        throw "Tiddler expected. Got "+tiddler;
    }

    return DataTiddler.getTiddlerDataObject(t);
};

// Returns the text of the content of the data section of the tiddler.
//
// When no data section is defined for the tiddler null is returned 
//
// @param tiddler either a tiddler name or a Tiddler
// @return [may be null]
//
DataTiddler.getDataText = function(tiddler) {
    var t = (typeof tiddler == "string") ? store.getTiddler(tiddler) : tiddler;
    if (!(t instanceof Tiddler)) {
        throw "Tiddler expected. Got "+tiddler;
    }

    return DataTiddler.readDataSectionText(t);
};


// ---------------------------------------------------------------------------
// Internal helper methods (must not be used by code from outside this plugin)
// ---------------------------------------------------------------------------

// Internal.
//
// The original JSONError is not very user friendly, 
// especially it does not define a toString() method
// Therefore we extend it here.
//
DataTiddler.extendJSONError = function(ex) {
	if (ex.name == 'JSONError') {
        ex.toString = function() {
			return ex.name + ": "+ex.message+" ("+ex.text+")";
		};
	}
	return ex;
};

// Internal.
//
// @param t a Tiddler
//
DataTiddler.getTiddlerDataObject = function(t) {
    if (t.dataObject === undefined) {
        var data = DataTiddler.readData(t);
        t.dataObject = (data) ? data : {};
    }
    
    return t.dataObject;
};


// Internal.
//
// @param tiddler a Tiddler
//
DataTiddler.getTiddlerDataValue = function(tiddler, field, defaultValue) {
    var value = DataTiddler.getTiddlerDataObject(tiddler)[field];
    return (value === undefined) ? defaultValue : value;
};


// Internal.
//
// @param tiddler a Tiddler
//
DataTiddler.setTiddlerDataValue = function(tiddler, field, value, defaultValue) {
    var data = DataTiddler.getTiddlerDataObject(tiddler);
    var oldValue = data[field];
	
    if (value == defaultValue) {
        if (oldValue !== undefined) {
            delete data[field];
            DataTiddler.save(tiddler);
        }
        return;
    }
    data[field] = value;
    DataTiddler.save(tiddler);
};

// Internal.
//
// Reads the data section from the tiddler's content and returns its text
// (as a String).
//
// Returns null when no data is defined.
//
// @param tiddler a Tiddler
// @return [may be null]
//
DataTiddler.readDataSectionText = function(tiddler) {
    var matches = DataTiddler.getDataTiddlerMatches(tiddler);
    if (matches === null || !matches[2]) {
        return null;
    }
    return matches[2];
};

// Internal.
//
// Reads the data section from the tiddler's content and returns it
// (as an internalized object).
//
// Returns null when no data is defined.
//
// @param tiddler a Tiddler
// @return [may be null]
//
DataTiddler.readData = function(tiddler) {
    var text = DataTiddler.readDataSectionText(tiddler);
	try {
	    return text ? DataTiddler.parse(text) : null;
	} catch(ex) {
		throw DataTiddler.extendJSONError(ex);
	}
};

// Internal.
// 
// Returns the serialized text of the data of the given tiddler, as it
// should be stored in the data section.
//
// @param tiddler a Tiddler
//
DataTiddler.getDataTextOfTiddler = function(tiddler) {
    var data = DataTiddler.getTiddlerDataObject(tiddler);
    return DataTiddler.stringify(data);
};


// Internal.
// 
DataTiddler.indexOfNonEscapedText = function(s, subString, startIndex) {
	var index = s.indexOf(subString, startIndex);
	while ((index > 0) && (s[index-1] == '~')) { 
		index = s.indexOf(subString, index+1);
	}
	return index;
};

// Internal.
//
DataTiddler.getDataSectionInfo = function(text) {
	// Special care must be taken to handle "<data>" and "</data>" texts inside
	// a data section. 
	// Also take care not to use an escaped <data> (i.e. "~<data>") as the start 
	// of a data section. (Same for </data>)

    // NOTE: we are explicitly searching for a data section that contains a JSON
    // string, i.e. framed with braces. This way we are little bit more robust in
    // case the tiddler contains unescaped texts "<data>" or "</data>". This must
    // be changed when using a different stringifier.

	var startTagText = "<data>{";
	var endTagText = "}</data>";

	var startPos = 0;

	// Find the first not escaped "<data>".
	var startDataTagIndex = DataTiddler.indexOfNonEscapedText(text, startTagText, 0);
	if (startDataTagIndex < 0) {
		return null;
	}

	// Find the *last* not escaped "</data>".
	var endDataTagIndex = text.indexOf(endTagText, startDataTagIndex);
	if (endDataTagIndex < 0) {
		return null;
	}
	var nextEndDataTagIndex;
	while ((nextEndDataTagIndex = text.indexOf(endTagText, endDataTagIndex+1)) >= 0) {
		endDataTagIndex = nextEndDataTagIndex;
	}

	return {
		prefixEnd: startDataTagIndex, 
		dataStart: startDataTagIndex+(startTagText.length)-1, 
		dataEnd: endDataTagIndex, 
		suffixStart: endDataTagIndex+(endTagText.length)
	};
};

// Internal.
// 
// Returns the "matches" of a content of a DataTiddler on the
// "data" regular expression. Return null when no data is defined
// in the tiddler content.
//
// Group 1: text before data section (prefix)
// Group 2: content of data section
// Group 3: text behind data section (suffix)
//
// @param tiddler a Tiddler
// @return [may be null] null when the tiddler contains no data section, otherwise see above.
//
DataTiddler.getDataTiddlerMatches = function(tiddler) {
	var text = tiddler.text;
	var info = DataTiddler.getDataSectionInfo(text);
	if (!info) {
		return null;
	}

	var prefix = text.substr(0,info.prefixEnd);
	var data = text.substr(info.dataStart, info.dataEnd-info.dataStart+1);
	var suffix = text.substr(info.suffixStart);
	
	return [text, prefix, data, suffix];
};


// Internal.
//
// Saves the data in a <data> block of the given tiddler (as a minor change). 
//
// The "chkAutoSave" and "chkForceMinorUpdate" options are respected. 
// I.e. the TiddlyWiki *file* is only saved when AutoSave is on.
//
// Notifications are not send. 
//
// This method should only be called when the data really has changed. 
//
// @param tiddler
//             the tiddler to be saved.
//
DataTiddler.save = function(tiddler) {

    var matches = DataTiddler.getDataTiddlerMatches(tiddler);

    var prefix;
    var suffix;
    if (matches === null) {
        prefix = tiddler.text;
        suffix = "";
    } else {
        prefix = matches[1];
        suffix = matches[3];
    }

    var dataText = DataTiddler.getDataTextOfTiddler(tiddler);
    var newText = 
            (dataText !== null) 
                ? prefix + "<data>" + dataText + "</data>" + suffix
                : prefix + suffix;
    if (newText != tiddler.text) {
        // make the change in the tiddlers text
        
        // ... see DataTiddler.MyTiddlerChangedFunction
        tiddler.isDataTiddlerChange = true;
        
        // ... do the action change
        tiddler.set(
                tiddler.title,
                newText,
                config.options.txtUserName, 
                config.options.chkForceMinorUpdate? undefined : new Date(),
                tiddler.tags);

        // ... see DataTiddler.MyTiddlerChangedFunction
        delete tiddler.isDataTiddlerChange;

        // Mark the store as dirty.
        store.dirty = true;
 
        // AutoSave if option is selected
        if(config.options.chkAutoSave) {
           saveChanges();
        }
    }
};

// Internal.
//
DataTiddler.MyTiddlerChangedFunction = function() {
    // Remove the data object from the tiddler when the tiddler is changed
    // by code other than DataTiddler code. 
    //
    // This is necessary since the data object is just a "cached version" 
    // of the data defined in the data section of the tiddler and the 
    // "external" change may have changed the content of the data section.
    // Thus we are not sure if the data object reflects the data section 
    // contents. 
    // 
    // By deleting the data object we ensure that the data object is 
    // reconstructed the next time it is needed, with the data defined by
    // the data section in the tiddler's text.
    
    // To indicate that a change is a "DataTiddler change" a temporary
    // property "isDataTiddlerChange" is added to the tiddler.
    if (this.dataObject && !this.isDataTiddlerChange) {
        delete this.dataObject;
    }
    
    // call the original code.
	DataTiddler.originalTiddlerChangedFunction.apply(this, arguments);
};


//============================================================================
// Formatters
//============================================================================

// This formatter ensures that "~<data>" is rendered as "<data>". This is used to 
// escape the "<data>" of a data section, just in case someone really wants to use
// "<data>" as a text in a tiddler and not start a data section.
//
// Same for </data>.
//
config.formatters.push( {
    name: "data-escape",
    match: "~<\\/?data>",

    handler: function(w) {
            w.outputText(w.output,w.matchStart + 1,w.nextMatch);
    }
} );


// This formatter ensures that <data>...</data> sections are not rendered.
//
config.formatters.push( {
    name: "data",
    match: "<data>",

    handler: function(w) {
		var info = DataTiddler.getDataSectionInfo(w.source);
		if (info && info.prefixEnd == w.matchStart) {
            w.nextMatch = info.suffixStart;
		} else {
			w.outputText(w.output,w.matchStart,w.nextMatch);
		}
    }
} );


//============================================================================
// Tiddler Class Extension
//============================================================================

// "Hijack" the changed method ---------------------------------------------------

DataTiddler.originalTiddlerChangedFunction = Tiddler.prototype.changed;
Tiddler.prototype.changed = DataTiddler.MyTiddlerChangedFunction;

// Define accessor methods -------------------------------------------------------

// Returns the value of the given data field of the tiddler. When no such field 
// is defined or its value is undefined the defaultValue is returned.
//
// When field is undefined (or null) the data object is returned. (See 
// DataTiddler.getDataObject.)
//
// @param field [may be null, undefined]
// @param defaultValue [may be null, undefined]
// @return [may be null, undefined]
//
Tiddler.prototype.data = function(field, defaultValue) {
    return (field) 
         ? DataTiddler.getTiddlerDataValue(this, field, defaultValue)
         : DataTiddler.getTiddlerDataObject(this);
};

// Sets the value of the given data field of the tiddler to the value. When the 
// value is equal to the defaultValue no value is set (and the field is removed).
//
// @param value [may be null, undefined]
// @param defaultValue [may be null, undefined]
//
Tiddler.prototype.setData = function(field, value, defaultValue) {
    DataTiddler.setTiddlerDataValue(this, field, value, defaultValue);
};


//============================================================================
// showData Macro
//============================================================================

config.macros.showData = {
     // Standard Properties
     label: "showData",
     prompt: "Display the values stored in the data section of the tiddler"
};

config.macros.showData.handler = function(place,macroName,params) {
    // --- Parsing ------------------------------------------

    var i = 0; // index running over the params
    // Parse the optional "JSON"
    var showInJSONFormat = false;
    if ((i < params.length) && params[i] == "JSON") {
        i++;
        showInJSONFormat = true;
    }
    
    var tiddlerName = story.findContainingTiddler(place).id.substr(7);
    if (i < params.length) {
        tiddlerName = params[i];
        i++;
    }

    // --- Processing ------------------------------------------
    try {
        if (showInJSONFormat) {
            this.renderDataInJSONFormat(place, tiddlerName);
        } else {
            this.renderDataAsTable(place, tiddlerName);
        }
    } catch (e) {
        this.createErrorElement(place, e);
    }
};

config.macros.showData.renderDataInJSONFormat = function(place,tiddlerName) {
    var text = DataTiddler.getDataText(tiddlerName);
    if (text) {
        createTiddlyElement(place,"pre",null,null,text);
    }
};

config.macros.showData.renderDataAsTable = function(place,tiddlerName) {
    var text = "|!Name|!Value|\n";
    var data = DataTiddler.getDataObject(tiddlerName);
    if (data) {
        for (var i in data) {
            var value = data[i];
            text += "|"+i+"|"+DataTiddler.stringify(value)+"|\n";
        }
    }
    
    wikify(text, place);
};


// Internal.
//
// Creates an element that holds an error message
// 
config.macros.showData.createErrorElement = function(place, exception) {
    var message = (exception.description) ? exception.description : exception.toString();
    return createTiddlyElement(place,"span",null,"showDataError","<<showData ...>>: "+message);
};

// ---------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// ---------------------------------------------------------------------------
//
setStylesheet(
    ".showDataError{color: #ffffff;background-color: #880000;}",
    "showData");


} // of "install only once"
// Used Globals (for JSLint) ==============

// ... TiddlyWiki Core
/*global 	createTiddlyElement, saveChanges, store, story, wikify */
// ... DataTiddler
/*global 	DataTiddler */
// ... JSON
/*global 	JSON */
			

/***
!JSON Code, used to serialize the data
***/
/*
Copyright (c) 2005 JSON.org

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The Software shall be used for Good, not Evil.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
*/

/*
    The global object JSON contains two methods.

    JSON.stringify(value) takes a JavaScript value and produces a JSON text.
    The value must not be cyclical.

    JSON.parse(text) takes a JSON text and produces a JavaScript value. It will
    throw a 'JSONError' exception if there is an error.
*/
var JSON = {
    copyright: '(c)2005 JSON.org',
    license: 'http://www.crockford.com/JSON/license.html',
/*
    Stringify a JavaScript value, producing a JSON text.
*/
    stringify: function (v) {
        var a = [];

/*
    Emit a string.
*/
        function e(s) {
            a[a.length] = s;
        }

/*
    Convert a value.
*/
        function g(x) {
            var c, i, l, v;

            switch (typeof x) {
            case 'object':
                if (x) {
                    if (x instanceof Array) {
                        e('[');
                        l = a.length;
                        for (i = 0; i < x.length; i += 1) {
                            v = x[i];
                            if (typeof v != 'undefined' &&
                                    typeof v != 'function') {
                                if (l < a.length) {
                                    e(',');
                                }
                                g(v);
                            }
                        }
                        e(']');
                        return;
                    } else if (typeof x.toString != 'undefined') {
                        e('{');
                        l = a.length;
                        for (i in x) {
                            v = x[i];
                            if (x.hasOwnProperty(i) &&
                                    typeof v != 'undefined' &&
                                    typeof v != 'function') {
                                if (l < a.length) {
                                    e(',');
                                }
                                g(i);
                                e(':');
                                g(v);
                            }
                        }
                        return e('}');
                    }
                }
                e('null');
                return;
            case 'number':
                e(isFinite(x) ? +x : 'null');
                return;
            case 'string':
                l = x.length;
                e('"');
                for (i = 0; i < l; i += 1) {
                    c = x.charAt(i);
                    if (c >= ' ') {
                        if (c == '\\' || c == '"') {
                            e('\\');
                        }
                        e(c);
                    } else {
                        switch (c) {
                            case '\b':
                                e('\\b');
                                break;
                            case '\f':
                                e('\\f');
                                break;
                            case '\n':
                                e('\\n');
                                break;
                            case '\r':
                                e('\\r');
                                break;
                            case '\t':
                                e('\\t');
                                break;
                            default:
                                c = c.charCodeAt();
                                e('\\u00' + Math.floor(c / 16).toString(16) +
                                    (c % 16).toString(16));
                        }
                    }
                }
                e('"');
                return;
            case 'boolean':
                e(String(x));
                return;
            default:
                e('null');
                return;
            }
        }
        g(v);
        return a.join('');
    },
/*
    Parse a JSON text, producing a JavaScript value.
*/
    parse: function (text) {
        var p = /^\s*(([,:{}\[\]])|"(\\.|[^\x00-\x1f"\\])*"|-?\d+(\.\d*)?([eE][+-]?\d+)?|true|false|null)\s*/,
            token,
            operator;

        function error(m, t) {
            throw {
                name: 'JSONError',
                message: m,
                text: t || operator || token
            };
        }

        function next(b) {
            if (b && b != operator) {
                error("Expected '" + b + "'");
            }
            if (text) {
                var t = p.exec(text);
                if (t) {
                    if (t[2]) {
                        token = null;
                        operator = t[2];
                    } else {
                        operator = null;
                        try {
                            token = eval(t[1]);
                        } catch (e) {
                            error("Bad token", t[1]);
                        }
                    }
                    text = text.substring(t[0].length);
                } else {
                    error("Unrecognized token", text);
                }
            } else {
                token = operator = undefined;
            }
        }


        function val() {
            var k, o;
            switch (operator) {
            case '{':
                next('{');
                o = {};
                if (operator != '}') {
                    for (;;) {
                        if (operator || typeof token != 'string') {
                            error("Missing key");
                        }
                        k = token;
                        next();
                        next(':');
                        o[k] = val();
                        if (operator != ',') {
                            break;
                        }
                        next(',');
                    }
                }
                next('}');
                return o;
            case '[':
                next('[');
                o = [];
                if (operator != ']') {
                    for (;;) {
                        o.push(val());
                        if (operator != ',') {
                            break;
                        }
                        next(',');
                    }
                }
                next(']');
                return o;
            default:
                if (operator !== null) {
                    error("Missing value");
                }
                k = token;
                next();
                return k;
            }
        }
        next();
        return val();
    }
};

/***
!Setup the data serialization
***/

DataTiddler.format = "JSON";
DataTiddler.stringify = JSON.stringify;
DataTiddler.parse = JSON.parse;

//}}}
[[Research Overview]]
/***
|''Name:''|DisableStrikeThroughPlugin|
|''Description:''|Allows you to disable TiddlyWiki's automatic linking of WikiWords|
|''Author:''|Martin Budden (mjbudden (at) gmail (dot) com)|
|''Source:''|http://www.martinswiki.com/#DisableStrikeThroughPlugin |
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/plugins/DisableStrikeThroughPlugin.js |
|''Version:''|0.0.1|
|''Date:''|Feb 18, 2008|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev |
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]] |
|''~CoreVersion:''|2.1.0|

***/

//{{{
// Ensure that the DisableStrikeThroughPlugin is only installed once.
if(!version.extensions.DisableStrikeThroughPlugin) {
version.extensions.DisableStrikeThroughPlugin = {installed:true};

if(version.major < 2 || (version.major == 2 && version.minor < 1))
	{alertAndThrow('DisableStrikeThroughPlugin requires TiddlyWiki 2.1 or newer.');}

DisableStrikeThroughPlugin = {};

DisableStrikeThroughPlugin.replaceFormatters = function()
{
	for(var i=0; i<config.formatters.length; i++) {
		var name = config.formatters[i].name;
		if(name == 'characterFormat') {
			config.formatters[i].match = "''|//|__|\\^\\^|~~|\\{\\{\\{";
			break;
		} else if(name == 'strikeByChar') {
			config.formatters.splice(i,1);
			break;
		}
	}
};
DisableStrikeThroughPlugin.replaceFormatters();

} // end of 'install only once'
//}}}
/***
|Name|DisableWikiLinksPlugin|
|Source|http://www.TiddlyTools.com/#DisableWikiLinksPlugin|
|Version|1.6.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Tiddler.prototype.autoLinkWikiWords, 'wikiLink' formatter|
|Options|##Configuration|
|Description|selectively disable TiddlyWiki's automatic ~WikiWord linking behavior|
This plugin allows you to disable TiddlyWiki's automatic ~WikiWord linking behavior, so that WikiWords embedded in tiddler content will be rendered as regular text, instead of being automatically converted to tiddler links.  To create a tiddler link when automatic linking is disabled, you must enclose the link text within {{{[[...]]}}}.
!!!!!Usage
<<<
You can block automatic WikiWord linking behavior for any specific tiddler by ''tagging it with<<tag excludeWikiWords>>'' (see configuration below) or, check a plugin option to disable automatic WikiWord links to non-existing tiddler titles, while still linking WikiWords that correspond to existing tiddlers titles or shadow tiddler titles.  You can also block specific selected WikiWords from being automatically linked by listing them in [[DisableWikiLinksList]] (see configuration below), separated by whitespace.  This tiddler is optional and, when present, causes the listed words to always be excluded, even if automatic linking of other WikiWords is being permitted.  

Note: WikiWords contained in default ''shadow'' tiddlers will be automatically linked unless you select an additional checkbox option lets you disable these automatic links as well, though this is not recommended, since it can make it more difficult to access some TiddlyWiki standard default content (such as AdvancedOptions or SideBarTabs)
<<<
!!!!!Configuration
<<<
<<option chkDisableWikiLinks>> Disable ALL automatic WikiWord tiddler links
<<option chkAllowLinksFromShadowTiddlers>> ... except for WikiWords //contained in// shadow tiddlers
<<option chkDisableNonExistingWikiLinks>> Disable automatic WikiWord links for non-existing tiddlers
Disable automatic WikiWord links for words listed in: <<option txtDisableWikiLinksList>>
Disable automatic WikiWord links for tiddlers tagged with: <<option txtDisableWikiLinksTag>>
<<<
!!!!!Revisions
<<<
2008.07.22 [1.6.0] hijack tiddler changed() method to filter disabled wiki words from internal links[] array (so they won't appear in the missing tiddlers list)
2007.06.09 [1.5.0] added configurable txtDisableWikiLinksTag (default value: "excludeWikiWords") to allows selective disabling of automatic WikiWord links for any tiddler tagged with that value.
2006.12.31 [1.4.0] in formatter, test for chkDisableNonExistingWikiLinks
2006.12.09 [1.3.0] in formatter, test for excluded wiki words specified in DisableWikiLinksList
2006.12.09 [1.2.2] fix logic in autoLinkWikiWords() (was allowing links TO shadow tiddlers, even when chkDisableWikiLinks is TRUE).  
2006.12.09 [1.2.1] revised logic for handling links in shadow content
2006.12.08 [1.2.0] added hijack of Tiddler.prototype.autoLinkWikiWords so regular (non-bracketed) WikiWords won't be added to the missing list
2006.05.24 [1.1.0] added option to NOT bypass automatic wikiword links when displaying default shadow content (default is to auto-link shadow content)
2006.02.05 [1.0.1] wrapped wikifier hijack in init function to eliminate globals and avoid FireFox 1.5.0.1 crash bug when referencing globals
2005.12.09 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.DisableWikiLinksPlugin= {major: 1, minor: 6, revision: 0, date: new Date(2008,7,22)};

if (config.options.chkDisableNonExistingWikiLinks==undefined) config.options.chkDisableNonExistingWikiLinks= false;
if (config.options.chkDisableWikiLinks==undefined) config.options.chkDisableWikiLinks=false;
if (config.options.txtDisableWikiLinksList==undefined) config.options.txtDisableWikiLinksList="DisableWikiLinksList";
if (config.options.chkAllowLinksFromShadowTiddlers==undefined) config.options.chkAllowLinksFromShadowTiddlers=true;
if (config.options.txtDisableWikiLinksTag==undefined) config.options.txtDisableWikiLinksTag="excludeWikiWords";

// find the formatter for wikiLink and replace handler with 'pass-thru' rendering
initDisableWikiLinksFormatter();
function initDisableWikiLinksFormatter() {
	for (var i=0; i<config.formatters.length && config.formatters[i].name!="wikiLink"; i++);
	config.formatters[i].coreHandler=config.formatters[i].handler;
	config.formatters[i].handler=function(w) {
		// supress any leading "~" (if present)
		var skip=(w.matchText.substr(0,1)==config.textPrimitives.unWikiLink)?1:0;
		var title=w.matchText.substr(skip);
		var exists=store.tiddlerExists(title);
		var inShadow=w.tiddler && store.isShadowTiddler(w.tiddler.title);
		// check for excluded Tiddler
		if (w.tiddler && w.tiddler.isTagged(config.options.txtDisableWikiLinksTag))
			{ w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }
		// check for specific excluded wiki words
		var t=store.getTiddlerText(config.options.txtDisableWikiLinksList);
		if (t && t.length && t.indexOf(w.matchText)!=-1)
			{ w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }
		// if not disabling links from shadows (default setting)
		if (config.options.chkAllowLinksFromShadowTiddlers && inShadow)
			return this.coreHandler(w);
		// check for non-existing non-shadow tiddler
		if (config.options.chkDisableNonExistingWikiLinks && !exists)
			{ w.outputText(w.output,w.matchStart+skip,w.nextMatch); return; }
		// if not enabled, just do standard WikiWord link formatting
		if (!config.options.chkDisableWikiLinks)
			return this.coreHandler(w);
		// just return text without linking
		w.outputText(w.output,w.matchStart+skip,w.nextMatch)
	}
}

Tiddler.prototype.coreAutoLinkWikiWords = Tiddler.prototype.autoLinkWikiWords;
Tiddler.prototype.autoLinkWikiWords = function()
{
	// if all automatic links are not disabled, just return results from core function
	if (!config.options.chkDisableWikiLinks)
		return this.coreAutoLinkWikiWords.apply(this,arguments);
	return false;
}

Tiddler.prototype.disableWikiLinks_changed = Tiddler.prototype.changed;
Tiddler.prototype.changed = function()
{
	this.disableWikiLinks_changed.apply(this,arguments);
	// remove excluded wiki words from links array
	var t=store.getTiddlerText(config.options.txtDisableWikiLinksList,"").readBracketedList();
	if (t.length) for (var i=0; i<t.length; i++)
		if (this.links.contains(t[i]))
			this.links.splice(this.links.indexOf(t[i]),1);
};
//}}}
*[[List of auxotrophic strains|http://cgsc.biology.yale.edu/Auxotrophs.php]]
/***
|Name|EditFieldPlugin|
|Source|http://www.TiddlyTools.com/#EditFieldPlugin|
|Version|1.6.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|extend core edit macro for use in ViewTemplates or direct embedding in tiddler content|
!!!!!Usage
<<<
Normally, when a tiddler is edited, a set of input fields is displayed (as defined by the [[EditTemplate]]), and any changes you make are only saved when you press the "done" (or "cancel") command in the tiddler editor's toolbar.  However, you can also ''embed an input field directly in //viewed// tiddler content'' by writing:
{{{
<<edit fieldname numberOfLines defaultValue>>
<<edit fieldname@TiddlerName numberOfLines defaultValue>>
}}}
or in the [[ViewTemplate]] (to add it to every tiddler):
{{{
<span macro='edit fieldname numberOfLines defaultValue'></span>
<span macro='edit fieldname@TiddlerName numberOfLines defaultValue'></span>
}}}
Unfortunately, while the input field will be displayed, the "done" command item is not available when //viewing// a tiddler, so the 'save/discard' handling cannot be invoked once you have decided that your input activities are complete, and any changes you make will not stored anywhere.  To address this, the plugin extends the input field handler so that when a field is embedded in normal tiddler content and you make changes, it can automatically save/discard your changes as soon as you press ENTER or move away ('onBlur' handling) from that input field.  You can also abandon your changes to input field content by pressing ESCAPE.

The plugin also adds support for an optional 'remote field reference' syntax: "{{{fieldname@TiddlerName}}}" so you can display and edit fields stored in other tiddlers.  This allows you to create, for example, 'summary' tiddlers for reviewing/editing field values from several tiddlers at the same time.

Note: a message is displayed before saving/discarding any field changes.  To suppress either (or both) of these confirmation messages, you can add the following configuration settings to [[EditFieldPluginConfig]] (or any other tiddler you are using to store and apply 'persistent settings'):
{{{
config.macros.edit.cancelMsg = "";
config.macros.edit.saveMsg = "";
}}}
<<<
!!!!!Examples
<<<
*"""<<edit foobar>>"""<br><<edit foobar>>
*"""<<edit foobar@SomeTiddler>>"""<br><<edit foobar@SomeTiddler>>
*"""<<edit tags>>"""<br><<edit tags>>
*"""<<edit text 15>>"""<br>{{editor{<<edit text 15>>}}}
<<<
!!!!!Revisions
<<<
2010.11.15 [1.6.1] In handler(), corrected display field values for 'non-stored' tiddler content (e.g., shadows, tags, default new tiddler)
2010.10.31 [1.6.0] In handler(), fixed display of remote field values.  In onblur(), refactored save/cancel message text for easier customization and bypass confirmation if text is blank.  
2009.09.16 [1.5.1] fixed 'onblur' handling for local fields (fieldname@here).  Added support for  '@here' syntax
2009.09.05 [1.5.0] code refactored.  added handling for fieldname@tiddlername
2007.08.22 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.EditFieldPlugin= {major: 1, minor: 6, revision: 1, date: new Date(2010,11,15)};

config.macros.edit.editFieldPlugin_savedHandler=config.macros.edit.handler;
config.macros.edit.cancelMsg = "Abandon changes to %0@%1?";
config.macros.edit.saveMsg = "Save changes to %0@%1?";
config.macros.edit.handler = function(place,macroName,params,wikifier,paramString,tiddler) {

	// let core render input/textarea, then get resulting element
	config.macros.edit.editFieldPlugin_savedHandler.apply(this,arguments);
	var fieldType=params[0]=="text"||params[1]?'textarea':'input';
	var elems=place.getElementsByTagName(fieldType); var e=elems[elems.length-1];

	// extended fieldname@tiddlername handling
	var parts=e.getAttribute("edit").split('@');
	var field=parts[0];
	var title=parts[1]||tiddler.title;
	if (title=='here') title=tiddler.title;
	// stop field from being saved with 'done' button
	if (parts[1]) { e.setAttribute("edit",null); e.setAttribute("field",field); }

	// save starting value and target tiddler
	e.value=store.getValue(title,field)||e.value; // get field value
	e.setAttribute("currval",e.value); // save starting value
	e.setAttribute("tiddler",title);

	// force height for textarea field
	if (fieldType=="textarea" && params[1]) e.style.height=params[1]+"em";

	// if viewing tiddler, add autosave handlers
	var here=story.findContainingTiddler(place);
	var isViewed=here&&here.getAttribute("template").indexOf("ViewTemplate")!=-1;
	if (parts[1]||isViewed) { // remote reference or view mode editing...
		story.setDirty(tiddler.title,false); // clear tiddler ("dirty") flag (set by core)
		e.onkeydown=function(ev) { // ENTER key=save (for single-line input)
			var event=ev?ev:window.event;
			this.setAttribute("keyCode",event.keyCode); // save last keyCode (for blur)
			if (event.keyCode==13 && this.nodeName.toUpperCase()!="TEXTAREA")
				this.saveField(); // save input to tiddler field
		}
		e.onblur=function(ev) { // confirm input when focus moves away
			var event=ev?ev:window.event;
			var tid=this.getAttribute("tiddler"); if (!tid || !tid.length) return;
			var field=this.getAttribute("edit")||this.getAttribute("field");
			if (this.value==this.getAttribute("currval")) return; // no change
			if (this.getAttribute("keyCode")=="27") { // if user pressed ESC
				var msg=config.macros.edit.cancelMsg.format([field,tid]);
				if (!msg.length || confirm(msg)) this.value=this.getAttribute("currval"); // reset value
				this.id=new Date().getTime(); // set unique ID for delayed re-focus after blur
				setTimeout("document.getElementById('"+this.id+"').focus()",1);
			} else { // other focus change events
				var msg=config.macros.edit.saveMsg.format([field,tid]);
				if (!msg.length || confirm(msg)) this.saveField(); // save value
				else this.value=this.getAttribute("currval");
			}
		};
		e.saveField=function() { // unpack/validate attribs and then save the field
			var tid=this.getAttribute("tiddler"); if (!tid || !tid.length) return;
			var field=this.getAttribute("edit")||this.getAttribute("field");
			var title=(field=="title")?this.value:tid;
			if (!title.length) { // error: blank tiddler title
				this.value=this.getAttribute("currval"); // reset value
				this.id=new Date().getTime(); // set unique ID for delayed messages/refocus
				setTimeout("displayMessage('Please enter a non-blank value')",1);
				setTimeout("document.getElementById('"+this.id+"').focus()",2);
				return;
			}
			config.macros.edit.saveField(tid,title,field,this.value);
			this.setAttribute("currval",this.value); // remember new starting value
		};
	}
}
//}}}
//{{{
// save input value to tiddler field (create/touch/rename tiddler as needed)
config.macros.edit.saveField = function(tid,title,field,val) {
	var t=store.getTiddler(tid);
	store.suspendNotifications();
	var anim=config.options.chkAnimate; config.options.chkAnimate=false; // suspend animation
	var who=t&&config.options.chkForceMinorUpdate?t.modifier:config.options.txtUserName;
	var when=t&&config.options.chkForceMinorUpdate?t.modified:new Date();
	store.saveTiddler(t?tid:title,title,t?t.text:"",who,when,t?t.tags:[],t?t.fields:null);
	store.setValue(title,field,val); // save field
	if (tid!=title) // new title... show renamed tiddler in place of current one
		{ story.displayTiddler(story.getTiddler(tid),title); story.closeTiddler(tid); }
	if (field=="text") // content changed, refresh tiddler display
		{ story.refreshTiddler(title,null,true); }
	config.options.chkAnimate=anim; // resume animation
	store.resumeNotifications();
	store.notify(title,true);
}
//}}}
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title wikified'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
[1>I[Survival of //pcm// mutants in stationary phase|wimages/pcm_nostress.jpg]]''PCM and survival''. In long-term stationary phase, isoaspartyl damage accumulates over time. One might imagine that PCM-deficient bacteria would show impaired survival, as more and more proteins become damaged. As shown at right, however, this is __not__ the case: mutants in which the //pcm// gene has been deleted (blue line) survive just as well as wild-type (unmutated) cells (black line)###Visick1998###. In contrast, the green line in the figure shows the drastic effect of mutating //rpoS//, a gene known to be important in stationary-phase survival.

''PCM and stress''. However, PCM is important in long-term stationary phase survival if the bacteria are __also__ subjected to an environmental stress: oxidative stress (using paraquat as a source of reactive oxygen species), osmotic stress (high salt), methanol or repeated heat stress (1-2 hrs/day at 42°C). The //pcm// mutant survives less well under these stressful conditions than its wild-type counterpart###Visick1998###. Survival curves for methanol and paraquat are shown below. The black line shows survival for wild-type cells, the blue line is the pcm mutant, and the red line is the mutant complemented with a functional //pcm// gene. Open circles show the survival of unstressed cells.
[0I[Stationary-phase survival of //pcm// mutants exposed to methanol (left) or paraquat (oxidative) stress (right)|wimages/pcm_stress.jpg]]

''PCM and competition''. Even in the absence of stress, PCM-deficient mutants compete poorly with their wild-type counterparts during long-term stationary phase. When wild-type cells are aged for 10 days, mutations are selected that allow these cells to out-compete "young" cells&mdash;even when the aged cells are greatly outnumbered. This is called the GASP (growth advantage in stationary phase) phenotype###Zambrano1996###. Aged cells in which //pcm// is deleted can occasionally "win" in the competition, but usually either fail to compete effectively or are out-competed by young wild-type cells. This suggests that isoaspartyl accumulation creates problems even for unstressed cells, but that the effect may be too subtle to measure by the survival assay shown above.

[1>I[Survival of //pcm// mutants in minimal medium buffered to pH 7|wimages/pcm_ph.jpg]]''PCM and pH''. Interestingly, the stress phenotypes described above are observed only when cells are grown in a rich medium, such as LB broth. As shown at right, //pcm// mutants show no survival defect when grown under stress in minimal medium buffered to pH7###Visick1998###. We hypothesized that the survival defects occur when growth on amino acids raises the pH of the growth medium and increases the rate of isoAsp formation. Survival testing in media buffered to specific pHs indicates that this is the case: //pcm// mutants survive poorly during long-term stationary phase when exposed to both high pH and a denaturing stress, even in minimal medium. Two North Central undergraduates published these results in the journal [[Microbiology|http://mic.sgmjournals.org/cgi/reprint/151/7/2151]] in 2005###Hicks2005###.
{{proctxt{
!!How it works
Electroporation is one means of transforming bacteria with DNA. Cells washed free of all medium and salts (to increase resistance) are mixed with DNA and placed in a cuvette with a narrow gap between two electrodes. A high-voltage electrical pulse is delivered, which causes temporary disruption of membranes and allows DNA to enter the cells.

!!Materials
{{proctab{
|Electroporation cuvettes (0.1- or 0.2-cm gap)|1 per transformation|
|[[Electrocompetent cells|Competent cells for electroporation]]|40 &mu;l per transformation|
|[[SOC medium]]|1 ml per transformation|
|Sterile, thin-stem disposable Pasteur pipettes|1 per transformation|
|Sterile culture tubes|1 per transformation|
}}}
!!Procedure###Calvin1988######Michelsen1995######Ymer1991###
*Place an aliquot of frozen, electrocompetent cells on ice```Cells @@color: red;''must remain cold''@@ until the pulse is delivered.``` to thaw. Also place the cuvette and the electroporation slide on ice.
*Add 1 to 2 &mu;l of the DNA```DNA must be in a low ionic strength buffer such as TE.``````When transforming ligations, transformation efficiency can be increased up to 250&times; by heat-inactivating ligase (10 min. at 65&deg;C) prior to transformation.``` to the 40-&mu;l cell aliquot and mix gently but well with pipette tip. Let stand on ice for 1 minute.
*Turn on the electroporator```<html><a href="docs/MicroPulser.pdf" target="_blank">MicroPulser electroporator instruction manual</a></html>``` and make sure the leads from the shocking chamber are connected to the output jacks.
*Set the electroporator to @@color: maroon;Ec1@@ for 0.1-cm cuvettes or @@color: maroon;Ec2@@ for 0.2-cm cuvettes (change setting with the @@color: maroon;raise@@ and @@color: maroon;lower@@ buttons).
*Transfer the cell/DNA mixture to the cold electroporation cuvette and tap the suspension all the way to the bottom. Look from the side to be sure there are no air bubbles. Return to ice for one additional minute.
*Quickly wipe any moisture from the cuvette, place the cuvette in the slide and seat it between the contacts in the shocking chamber. Press the @@color: maroon;Pulse@@ button once and wait for the tone.
*Immediately```Speed of resuspending the cells is critical; transformation frequency is reduced if this process takes more than 30 sec.``` add 1 ml of SOC medium to the cuvette. Resuspend the cells quickly but gently with a thin, sterile disposable Pasteur pipette.
*Transfer the suspension to a culture tube and incubate with aeration at 37&deg;C for 1 hour.
*Record the actual voltage and time constant```The time constant for the pulse should be close to 5 ms; if @@color: maroon;Arc@@ is displayed, sample resistance may have been too low (e.g., too much salt), or cuvette may not have been clean enough.```
*Plate desired volume (typically 100 &mu;l) on selective medium.
*Clean the cuvette thoroughly: add 10% bleach to the cuvette, wait 5 minutes, then rinse 10&times; with dH~~2~~O, 3&times; with 95% ethanol and 3&times; more with dH~~2~~O.
}}}
/***
|Name|FileDropPlugin|
|Source|http://www.TiddlyTools.com/#FileDropPlugin|
|Version|2.1.4|
|Author|BradleyMeck and Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|drag-and-drop files/directories to create tiddlers|
''requires FireFox or another Mozilla-compatible browser.''
!!!!!Usage
<<<
This plugin automatically creates tiddlers from files that are dropped onto an open TiddlyWiki document.  You can drop multiple selected files and/or folders to create many tiddlers at once.  New tiddler titles are created using the filename of each dropped file (i.e., omitting the path).  If a title is already in use, you are prompted to enter a new title for that file.  If you drop a folder, you will be asked if you want to create a simple 'directory list' of files in a single tiddler or create one tiddler for each file in that folder.  

By default, it is assumed that all dropped files contain text.  However, if [[AttachFilePlugin]], [[AttachFilePluginFormatters]] and [[AttachFileMIMETypes]] are installed, then you can drop ''//binary data files//'' as well as text files.  If the MIME type of a dropped file is not "text/plain", then AttachFilePlugin is used to create an 'attachment' tiddler, rather than creating a simple text tiddler.

When creating text tiddlers, you can embed a //link// to the original external file at the top of the new tiddler, in addition to (or instead of) the text content itself.  The format for this link (see Configuration, below) uses embedded ''//replacement markers//'' that allow you to generate a variety of wiki-formatted output, where:
*%0 = filename (without path)
*%1 = local """file://...""" URL
*%2 = local path and filename (OS-native format)
*%3 = relative path (if subdirectory of current document directory)
*%4 = file size
*%5 = file date
*%6 = current date
*%7 = current ~TiddlyWiki username
*\n = newline
By default, the link format uses the filename (%0) and local URL (%1), enclosed within a //hidden section// syntax, like this:
{{{
/%
!link
[[%0|%1]]
!end
%/
}}}
This permits the link to be embedded along with the text content, without changing the appearance of that content when the tiddler is viewed.  To display the link in your tiddler content, use:
{{{
<<tiddler TiddlerName##link>>
}}}
<<<
!!!!!Configuration
<<<
__FileDropPlugin options:__
<<option chkFileDropContent>>Copy file content into tiddlers if smaller than: <<option txtFileDropDataLimit>> bytes
&nbsp; //(note: excess text content will be truncated, oversized binary files will skipped, 0=no limit)//
<<option chkFileDropLink>>Generate external links to files, using this format:{{editor{<html><nowiki><textarea rows="4" onchange="
config.macros.option.propagateOption('txtFileDropLinkFormat','value',this.value.escapeLineBreaks(),'input');
"></textarea></html><<tiddler {{
	var ta=place.lastChild.getElementsByTagName('textarea')[0];
	var v=config.options.txtFileDropLinkFormat.unescapeLineBreaks();
	ta.value=v;
"";}}>>}}}<<option chkFileDropTrimFilename>>Omit file extensions from tiddler titles
<<option chkFileDropDisplay>>Automatically display newly created tiddlers
Tag newly created tiddlers with: <<option txtFileDropTags>>

__FileDropPlugin+AttachFilePlugin options:__ //(binary file data as encoded 'base64' text)//
<<option chkFileDropAttachLocalLink>> attachment includes reference to local path/filename
>Note: if the plugin does not seem to work, enter ''about:config'' in the Firefox address bar, and make sure that {{{signed.applets.codebase_principal_support}}} is set to ''true''
<<<
!!!!!Examples (custom handler functions)
<<<
Adds a single file with confirmation and prompting for title:
{{{
config.macros.fileDrop.addEventListener('application/x-moz-file',
	function(nsiFile) {
		var msg='You have dropped the file:\n'
			+nsiFile.path+'\n'
			+'onto the page, it will be imported as a tiddler. Is that ok?'
		if(confirm(msg)) {
			var newDate = new Date();
			var title = prompt('what would you like to name the tiddler?');
			store.saveTiddler(title,title,loadFile(nsiFile.path),config.options.txtUserName,newDate,[]);
		}
		return true;
	});
}}}
Adds a single file without confirmation, using path/filename as tiddler title:
{{{
config.macros.fileDrop.addEventListener('application/x-moz-file',
	function(nsiFile) {
		var newDate = new Date();
		store.saveTiddler(nsiFile.path,nsiFile.path,loadFile(nsiFile.path),config.options.txtUserName,newDate,[]);
		story.displayTiddler(null,nsiFile.path)
		return true;
	});
}}}
<<<
!!!!!Revisions
<<<
2010.03.06 2.1.4 added event listener for 'dragover' (for FireFox 3.6+)
2009.10.10 2.1.3 fixed IE code error
2009.10.08 2.1.2 fixed chkFileDropContent bypass handling for binary attachments
2009.10.07 2.1.0 added chkFileDropContent and chkFileDropLink/txtFileDropLinkFormat
2009.08.19 2.0.0 fixed event listener registration for FireFox 3.5+.  Also, merged with FileDropPluginConfig, with code cleanup/reduction
2008.08.11 1.5.1 added chkFileDropAttachLocalLink option to allow suppression of local path/file link
2007.xx.xx *.*.* add suspend/resume of notifications to improve performance when multiple files are handled
2007.01.01 0.9.9 extensions for AttachFilePlugin
2006.11.04 0.1.1 initial release by Bradley Meck
<<<
!!!!!Code
***/
//{{{
version.extensions.FileDropPlugin={major:2, minor:1, revision:4, date: new Date(2010,3,6)};

config.macros.fileDrop = {
	customDropHandlers: [],
	addEventListener: function(paramflavor,func,inFront) {
		var obj={}; obj.flavor=paramflavor; obj.handler=func;
		if (!inFront) this.customDropHandlers.push(obj);
		else this.customDropHandlers.shift(obj);
	},
	dragDropHandler: function(evt) {
		netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
		var dragService = Components.classes['@mozilla.org/widget/dragservice;1'].getService(Components.interfaces.nsIDragService);
		var dragSession = dragService.getCurrentSession();
		var transferObject = Components.classes['@mozilla.org/widget/transferable;1'].createInstance();
		transferObject = transferObject.QueryInterface(Components.interfaces.nsITransferable);
		transferObject.addDataFlavor('application/x-moz-file');
		var numItems = dragSession.numDropItems;
		if (numItems>1) {
			clearMessage();
			displayMessage('Reading '+numItems+' files...');
			store.suspendNotifications();
		}
		for (var i = 0; i < numItems; i++) {
			dragSession.getData(transferObject, i);
			var dataObj = {};
			var dropSizeObj = {};
			for(var ind=0; ind<config.macros.fileDrop.customDropHandlers.length; ind++) {
				var item = config.macros.fileDrop.customDropHandlers[ind];
				if(dragSession.isDataFlavorSupported(item.flavor)) {
					transferObject.getTransferData(item.flavor, dataObj, dropSizeObj);
					var droppedFile = dataObj.value.QueryInterface(Components.interfaces.nsIFile);
					var result = item.handler.call(item,droppedFile);
					evt.stopPropagation();
					evt.preventDefault();
					if (result) break;
				}
			}
		}
		if (numItems>1) {
			store.resumeNotifications();
			store.notifyAll();
			displayMessage(numItems+' files have been processed');
		}
	}
}
//}}}
/***
!!!!!window event handlers
***/
//{{{
if(!window.event) {
	window.addEventListener('dragdrop',	// FireFox3.1-
		config.macros.fileDrop.dragDropHandler, true);
	window.addEventListener('drop',		// FireFox3.5+
		config.macros.fileDrop.dragDropHandler, true);
	window.addEventListener('dragover',	// FireFox3.6+
		function(e){e.stopPropagation();e.preventDefault();}, true); 
}
//}}}
/***
!!!!!handler for files, directories and binary attachments (see [[AttachFilePlugin]])
***/
//{{{
var defaults={
	chkFileDropDisplay:		true,
	chkFileDropTrimFilename:	false,
	chkFileDropContent:		true,
	chkFileDropLink:		true,
	txtFileDropLinkFormat:		'/%\\n!link\\n[[%0|%1]]\\n!end\\n%/',
	txtFileDropDataLimit:		'32768',
	chkFileDropAttachLocalLink:	true,
	txtFileDropTags:		''
};
for (var id in defaults) if (config.options[id]===undefined)
	config.options[id]=defaults[id];

config.macros.fileDrop.addEventListener('application/x-moz-file',function(nsiFile) {
	var co=config.options; // abbrev
	var header='Index of %0\n^^(as of %1)^^\n|!filename| !size | !modified |\n';
	var item='|[[%0|%1]]| %2|%3|\n';
	var footer='Total of %0 bytes in %1 files\n';
	var now=new Date();
	var files=[nsiFile];
	if (nsiFile.isDirectory()) {
		var folder=nsiFile.directoryEntries;
		var files=[];
		while (folder.hasMoreElements()) {
			var f=folder.getNext().QueryInterface(Components.interfaces.nsILocalFile);
			if (f instanceof Components.interfaces.nsILocalFile && !f.isDirectory()) files.push(f);
		}
		var msg=nsiFile.path.replace(/\\/g,'/')+'\n\n';
		msg+='contains '+files.length+' files... ';
		msg+='select OK to attach all files or CANCEL to create a list...';
		if (!confirm(msg)) { // create a list in a tiddler
			var title=nsiFile.leafName; // tiddler name is last directory name in path
			while (title && title.length && store.tiddlerExists(title)) {
				if (confirm(config.messages.overwriteWarning.format([title]))) break;
				title=prompt('Enter a new tiddler title',nsiFile.path.replace(/\\/g,'/'));
			}
			if (!title || !title.length) return true; // cancelled
			var text=header.format([nsiFile.path.replace(/\\/g,'/'),now.toLocaleString()]);
			var total=0;
			for (var i=0; i<files.length; i++) { var f=files[i];
				var name=f.leafName;
				if (co.chkFileDropTrimFilename)
					{ var p=name.split('.'); if (p.length>1) p.pop(); name=p.join('.'); }
				var path='file:///'+f.path.replace(/\\/g,'/');
				var size=f.fileSize; total+=size;
				var when=new Date(f.lastModifiedTime).formatString('YYYY.0MM.0DD 0hh:0mm:0ss');
				text+=item.format([name,path,size,when]);
			}
			text+=footer.format([total,files.length]);
			var newtags=co.txtFileDropTags?co.txtFileDropTags.readBracketedList():[];
			store.saveTiddler(null,title,text,co.txtUserName,now,newtags);
			if (co.chkFileDropDisplay) story.displayTiddler(null,title);
			return true;
		}
	}
	if (files.length>1) store.suspendNotifications();
	for (i=0; i<files.length; i++) {
		var file=files[i];
		if (file.isDirectory()) continue; // skip over nested directories
		var type='text/plain';
		var title=file.leafName; // tiddler name is file name
		if (co.chkFileDropTrimFilename)
			{ var p=title.split('.'); if (p.length>1) p.pop(); title=p.join('.'); }
		var name=file.leafName;
		var path=file.path;
		var url='file:///'+path.replace(/\\/g,'/');
		var size=file.fileSize;
		var when=new Date(file.lastModifiedTime);
		var now=new Date();
		var who=config.options.txtUserName;
		var h=document.location.href;
		var cwd=getLocalPath(decodeURIComponent(h.substr(0,h.lastIndexOf('/')+1)));
		var relpath=path.startsWith(cwd)?'./'+path.substr(cwd.length):path;
		while (title && title.length && store.tiddlerExists(title)) {
			if (confirm(config.messages.overwriteWarning.format([title]))) break;
			title=prompt('Enter a new tiddler title',path.replace(/\\/g,'/'));
		}
		if (!title || !title.length) continue; // cancelled
		if (config.macros.attach) {
			type=config.macros.attach.getMIMEType(name,'');
			if (!type.length)
				type=prompt('Unknown file type.  Enter a MIME type','text/plain');
			if (!type||!type.length) continue; // cancelled
		}
		var newtags=co.txtFileDropTags?co.txtFileDropTags.readBracketedList():[];
		if (type=='text/plain' || !co.chkFileDropContent) {
			var txt=''; var fmt=co.txtFileDropLinkFormat.unescapeLineBreaks();
			if (co.chkFileDropLink) txt+=fmt.format([name,url,path,relpath,size,when,now,who]);
			if (co.chkFileDropContent) {
				var out=loadFile(path); var lim=co.txtFileDropDataLimit;
				txt+=co.txtFileDropDataLimit?out.substr(0,lim):out;
				if (size>lim) txt+='\n----\nfilesize ('+size+')'
					+' is larger than FileDrop limit ('+lim+')...\n'
					+'additional content has been omitted';
			}
			store.saveTiddler(null,title,txt,co.txtUserName,now,newtags);
		} else {
			var embed=co.chkFileDropContent
				&& (!co.txtFileDropDataLimit||size<co.txtFileDropDataLimit);
			newtags.push('attachment'); newtags.push('excludeMissing');
			config.macros.attach.createAttachmentTiddler(path,
				now.formatString(config.macros.timeline.dateFormat),
				'attached by FileDropPlugin', newtags, title,
				embed, co.chkFileDropAttachLocalLink, false,
				relpath, '', type,!co.chkFileDropDisplay);
		}
		if (co.chkFileDropDisplay) story.displayTiddler(null,title);
	}
	if (files.length>1) { store.resumeNotifications(); store.notifyAll(); }
	return true;
})
//}}}
aggregation
aging
bacterial aging
chaperones
isoaspartate
oxidation
pcm
persisters
proteases
protein damage
protein folding
protein repair
stationary phase
stress responses
techniques
toxin-antitoxin
/*{{{*/

@font-face {
        font-family: 'ZapfHumanist';
        font-style: normal;
        font-weight: normal;
        src: local('fonts/ZHUM601N.ttf'), url('fonts/ZHUM601N.ttf') format('truetype');
        } 
@font-face {
        font-family: 'ZapfHumanist';
        font-style: italic;
        font-weight: normal;
        src: local('fonts/ZHUM601I.ttf'), url('fonts/ZHUM601I.ttf') format('truetype');
        } 
@font-face {
        font-family: 'ZapfHumanist';
        font-style: normal;
        font-weight: bold;
        src: local('fonts/ZHUM601B.ttf'), url('fonts/ZHUM601B.ttf') format('truetype');
        } 
@font-face {
        font-family: 'ZapfHumanist';
        font-style: italic;
        font-weight: bold;
        src: local('fonts/ZHUM601BI.ttf'), url('fonts/ZHUM601BI.ttf') format('truetype');
        } 
@font-face {
        font-family: 'AvantGarde';
        font-style: normal;
        font-weight: normal;
        src: local('fonts/AVGARDN.ttf'), url('fonts/AVGARDN.ttf') format('truetype');
        } 
@font-face {
        font-family: 'AvantGarde';
        font-style: italic;
        font-weight: normal;
        src: local('fonts/AVGARDNI.ttf'), url('fonts/AVGARDNI.ttf') format('truetype');
        } 
@font-face {
        font-family: 'AvantGarde';
        font-style: normal;
        font-weight: bold;
        src: local('fonts/AVGARDD.ttf'), url('fonts/AVGARDD.ttf') format('truetype');
        } 
@font-face {
        font-family: 'AvantGarde';
        font-style: italic;
        font-weight: bold;
        src: local('fonts/AVGARDDO.ttf'), url('fonts/AVGARDDO.ttf') format('truetype');
        }
 
/*}}}*/
/***
|''Name:''|FootnotesPlugin|
|''Description:''|Create automated tiddler footnotes.|
|''Author:''|Saq Imtiaz ( lewcid@gmail.com )|
|''Source:''|http://tw.lewcid.org/#FootnotesPlugin|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.01|
|''Date:''|10/25/07|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.2|

!!Usage:
*To create a footnote, just put the footnote text inside triple backticks.
*Footnotes are numbered automatically, and listed at the bottom of the tiddler.
*{{{Creating a footnote is easy. ```This is the text for my footnote```}}}
*[[Example|FootnotesDemo]]
***/
// /%
//!BEGIN-PLUGIN-CODE
config.footnotesPlugin = {
	backLabel: "\u25B2",
	prompt:"show footnote"
};

config.formatters.unshift( {
    name: "footnotes",
    match: "```",
    lookaheadRegExp: /```((?:.|\n)*?)```/g,
    handler: function(w)
    {
        this.lookaheadRegExp.lastIndex = w.matchStart;
        var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
        if(lookaheadMatch && lookaheadMatch.index == w.matchStart )
            {
			var tiddler = story.findContainingTiddler(w.output);
			if (!tiddler.notes)
				tiddler.notes = [];
			var title = tiddler.getAttribute("tiddler");
			tiddler.notes.pushUnique(lookaheadMatch[1]);
			var pos = tiddler.notes.indexOf(lookaheadMatch[1]) + 1;
			createTiddlyButton(w.output,String.fromCharCode(pos+96),config.footnotesPlugin.prompt,function()
                          { document.getElementById(title+"footnoteholder").scrollIntoView();
                            return false;
                            },"ftnlink",title+"ftnlink"+pos);			
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
            }
    }
});

old_footnotes_refreshTiddler = Story.prototype.refreshTiddler;
Story.prototype.refreshTiddler = function(title,template,force)
{
    var tiddler = old_footnotes_refreshTiddler.apply(this,arguments);
	if (tiddler.notes && tiddler.notes.length)
	{
		var holder = createTiddlyElement(null,"div",null,"footnoteholder","");
                var nimg = createTiddlyElement(holder,"img",null,"nimg","");
                var ntxt = createTiddlyText(holder,"Notes");
                nimg.src = "icons/clip.png";
		var list = createTiddlyElement(holder,"ol",title+"footnoteholder","ftnlist");
		for (var i=0; i<tiddler.notes.length; i++)
		{
			var ftn = createTiddlyElement(list,"li",title+"ftn"+(i+1),"footnote");
			wikify(tiddler.notes[i]+" ",ftn);
			createTiddlyButton(ftn,config.footnotesPlugin.backLabel,"back",function(){window.scrollTo(0,ensureVisible(document.getElementById(this.parentNode.id.replace("ftn","ftnlink"))));return false;},"ftnbklink");
		}
		var count = tiddler.childNodes.length;
		for (var j=0; j<count; j++){
			if(hasClass(tiddler.childNodes[j],"viewer")){
				var viewer = tiddler.childNodes[j];	
			}
		}
		viewer.appendChild(holder);
		tiddler.notes = [];
	}
    return tiddler;
};

//!END-PLUGIN-CODE
// %/
/***
|''Name:''|ForEachTiddlerPlugin|
|''Version:''|1.0.8 (2007-04-12)|
|''Source:''|http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''Copyright:''|&copy; 2005-2007 [[abego Software|http://www.abego-software.de]]|
|''TiddlyWiki:''|1.2.38+, 2.0|
|''Browser:''|Firefox 1.0.4+; Firefox 1.5; InternetExplorer 6.0|
!Description

Create customizable lists, tables etc. for your selections of tiddlers. Specify the tiddlers to include and their order through a powerful language.

''Syntax:'' 
|>|{{{<<}}}''forEachTiddler'' [''in'' //tiddlyWikiPath//] [''where'' //whereCondition//] [''sortBy'' //sortExpression// [''ascending'' //or// ''descending'']] [''script'' //scriptText//] [//action// [//actionParameters//]]{{{>>}}}|
|//tiddlyWikiPath//|The filepath to the TiddlyWiki the macro should work on. When missing the current TiddlyWiki is used.|
|//whereCondition//|(quoted) JavaScript boolean expression. May refer to the build-in variables {{{tiddler}}} and  {{{context}}}.|
|//sortExpression//|(quoted) JavaScript expression returning "comparable" objects (using '{{{<}}}','{{{>}}}','{{{==}}}'. May refer to the build-in variables {{{tiddler}}} and  {{{context}}}.|
|//scriptText//|(quoted) JavaScript text. Typically defines JavaScript functions that are called by the various JavaScript expressions (whereClause, sortClause, action arguments,...)|
|//action//|The action that should be performed on every selected tiddler, in the given order. By default the actions [[addToList|AddToListAction]] and [[write|WriteAction]] are supported. When no action is specified [[addToList|AddToListAction]]  is used.|
|//actionParameters//|(action specific) parameters the action may refer while processing the tiddlers (see action descriptions for details). <<tiddler [[JavaScript in actionParameters]]>>|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|

See details see [[ForEachTiddlerMacro]] and [[ForEachTiddlerExamples]].

!Revision history
* v1.0.8 (2007-04-12)
** Adapted to latest TiddlyWiki 2.2 Beta importTiddlyWiki API (introduced with changeset 2004). TiddlyWiki 2.2 Beta builds prior to changeset 2004 are no longer supported (but TiddlyWiki 2.1 and earlier, of cause)
* v1.0.7 (2007-03-28)
** Also support "pre" formatted TiddlyWikis (introduced with TW 2.2) (when using "in" clause to work on external tiddlers)
* v1.0.6 (2006-09-16)
** Context provides "viewerTiddler", i.e. the tiddler used to view the macro. Most times this is equal to the "inTiddler", but when using the "tiddler" macro both may be different.
** Support "begin", "end" and "none" expressions in "write" action
* v1.0.5 (2006-02-05)
** Pass tiddler containing the macro with wikify, context object also holds reference to tiddler containing the macro ("inTiddler"). Thanks to SimonBaird.
** Support Firefox 1.5.0.1
** Internal
*** Make "JSLint" conform
*** "Only install once"
* v1.0.4 (2006-01-06)
** Support TiddlyWiki 2.0
* v1.0.3 (2005-12-22)
** Features: 
*** Write output to a file supports multi-byte environments (Thanks to Bram Chen) 
*** Provide API to access the forEachTiddler functionality directly through JavaScript (see getTiddlers and performMacro)
** Enhancements:
*** Improved error messages on InternetExplorer.
* v1.0.2 (2005-12-10)
** Features: 
*** context object also holds reference to store (TiddlyWiki)
** Fixed Bugs: 
*** ForEachTiddler 1.0.1 has broken support on win32 Opera 8.51 (Thanks to BrunoSabin for reporting)
* v1.0.1 (2005-12-08)
** Features: 
*** Access tiddlers stored in separated TiddlyWikis through the "in" option. I.e. you are no longer limited to only work on the "current TiddlyWiki".
*** Write output to an external file using the "toFile" option of the "write" action. With this option you may write your customized tiddler exports.
*** Use the "script" section to define "helper" JavaScript functions etc. to be used in the various JavaScript expressions (whereClause, sortClause, action arguments,...).
*** Access and store context information for the current forEachTiddler invocation (through the build-in "context" object) .
*** Improved script evaluation (for where/sort clause and write scripts).
* v1.0.0 (2005-11-20)
** initial version

!Code
***/
//{{{

	
//============================================================================
//============================================================================
//		   ForEachTiddlerPlugin
//============================================================================
//============================================================================

// Only install once
if (!version.extensions.ForEachTiddlerPlugin) {

if (!window.abego) window.abego = {};

version.extensions.ForEachTiddlerPlugin = {
	major: 1, minor: 0, revision: 8, 
	date: new Date(2007,3,12), 
	source: "http://tiddlywiki.abego-software.de/#ForEachTiddlerPlugin",
	licence: "[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]",
	copyright: "Copyright (c) abego Software GmbH, 2005-2007 (www.abego-software.de)"
};

// For backward compatibility with TW 1.2.x
//
if (!TiddlyWiki.prototype.forEachTiddler) {
	TiddlyWiki.prototype.forEachTiddler = function(callback) {
		for(var t in this.tiddlers) {
			callback.call(this,t,this.tiddlers[t]);
		}
	};
}

//============================================================================
// forEachTiddler Macro
//============================================================================

version.extensions.forEachTiddler = {
	major: 1, minor: 0, revision: 8, date: new Date(2007,3,12), provider: "http://tiddlywiki.abego-software.de"};

// ---------------------------------------------------------------------------
// Configurations and constants 
// ---------------------------------------------------------------------------

config.macros.forEachTiddler = {
	 // Standard Properties
	 label: "forEachTiddler",
	 prompt: "Perform actions on a (sorted) selection of tiddlers",

	 // actions
	 actions: {
		 addToList: {},
		 write: {}
	 }
};

// ---------------------------------------------------------------------------
//  The forEachTiddler Macro Handler 
// ---------------------------------------------------------------------------

config.macros.forEachTiddler.getContainingTiddler = function(e) {
	while(e && !hasClass(e,"tiddler"))
		e = e.parentNode;
	var title = e ? e.getAttribute("tiddler") : null; 
	return title ? store.getTiddler(title) : null;
};

config.macros.forEachTiddler.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
	// config.macros.forEachTiddler.traceMacroCall(place,macroName,params,wikifier,paramString,tiddler);

	if (!tiddler) tiddler = config.macros.forEachTiddler.getContainingTiddler(place);
	// --- Parsing ------------------------------------------

	var i = 0; // index running over the params
	// Parse the "in" clause
	var tiddlyWikiPath = undefined;
	if ((i < params.length) && params[i] == "in") {
		i++;
		if (i >= params.length) {
			this.handleError(place, "TiddlyWiki path expected behind 'in'.");
			return;
		}
		tiddlyWikiPath = this.paramEncode((i < params.length) ? params[i] : "");
		i++;
	}

	// Parse the where clause
	var whereClause ="true";
	if ((i < params.length) && params[i] == "where") {
		i++;
		whereClause = this.paramEncode((i < params.length) ? params[i] : "");
		i++;
	}

	// Parse the sort stuff
	var sortClause = null;
	var sortAscending = true; 
	if ((i < params.length) && params[i] == "sortBy") {
		i++;
		if (i >= params.length) {
			this.handleError(place, "sortClause missing behind 'sortBy'.");
			return;
		}
		sortClause = this.paramEncode(params[i]);
		i++;

		if ((i < params.length) && (params[i] == "ascending" || params[i] == "descending")) {
			 sortAscending = params[i] == "ascending";
			 i++;
		}
	}

	// Parse the script
	var scriptText = null;
	if ((i < params.length) && params[i] == "script") {
		i++;
		scriptText = this.paramEncode((i < params.length) ? params[i] : "");
		i++;
	}

	// Parse the action. 
	// When we are already at the end use the default action
	var actionName = "addToList";
	if (i < params.length) {
	   if (!config.macros.forEachTiddler.actions[params[i]]) {
			this.handleError(place, "Unknown action '"+params[i]+"'.");
			return;
		} else {
			actionName = params[i]; 
			i++;
		}
	} 
	
	// Get the action parameter
	// (the parsing is done inside the individual action implementation.)
	var actionParameter = params.slice(i);


	// --- Processing ------------------------------------------
	try {
		this.performMacro({
				place: place, 
				inTiddler: tiddler,
				whereClause: whereClause, 
				sortClause: sortClause, 
				sortAscending: sortAscending, 
				actionName: actionName, 
				actionParameter: actionParameter, 
				scriptText: scriptText, 
				tiddlyWikiPath: tiddlyWikiPath});

	} catch (e) {
		this.handleError(place, e);
	}
};

// Returns an object with properties "tiddlers" and "context".
// tiddlers holds the (sorted) tiddlers selected by the parameter,
// context the context of the execution of the macro.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlersAndContext = function(parameter) {

	var context = config.macros.forEachTiddler.createContext(parameter.place, parameter.whereClause, parameter.sortClause, parameter.sortAscending, parameter.actionName, parameter.actionParameter, parameter.scriptText, parameter.tiddlyWikiPath, parameter.inTiddler);

	var tiddlyWiki = parameter.tiddlyWikiPath ? this.loadTiddlyWiki(parameter.tiddlyWikiPath) : store;
	context["tiddlyWiki"] = tiddlyWiki;
	
	// Get the tiddlers, as defined by the whereClause
	var tiddlers = this.findTiddlers(parameter.whereClause, context, tiddlyWiki);
	context["tiddlers"] = tiddlers;

	// Sort the tiddlers, when sorting is required.
	if (parameter.sortClause) {
		this.sortTiddlers(tiddlers, parameter.sortClause, parameter.sortAscending, context);
	}

	return {tiddlers: tiddlers, context: context};
};

// Returns the (sorted) tiddlers selected by the parameter.
//
// The action is not yet performed.
//
// @parameter see performMacro
//
config.macros.forEachTiddler.getTiddlers = function(parameter) {
	return this.getTiddlersAndContext(parameter).tiddlers;
};

// Performs the macros with the given parameter.
//
// @param parameter holds the parameter of the macro as separate properties.
//				  The following properties are supported:
//
//						place
//						whereClause
//						sortClause
//						sortAscending
//						actionName
//						actionParameter
//						scriptText
//						tiddlyWikiPath
//
//					All properties are optional. 
//					For most actions the place property must be defined.
//
config.macros.forEachTiddler.performMacro = function(parameter) {
	var tiddlersAndContext = this.getTiddlersAndContext(parameter);

	// Perform the action
	var actionName = parameter.actionName ? parameter.actionName : "addToList";
	var action = config.macros.forEachTiddler.actions[actionName];
	if (!action) {
		this.handleError(parameter.place, "Unknown action '"+actionName+"'.");
		return;
	}

	var actionHandler = action.handler;
	actionHandler(parameter.place, tiddlersAndContext.tiddlers, parameter.actionParameter, tiddlersAndContext.context);
};

// ---------------------------------------------------------------------------
//  The actions 
// ---------------------------------------------------------------------------

// Internal.
//
// --- The addToList Action -----------------------------------------------
//
config.macros.forEachTiddler.actions.addToList.handler = function(place, tiddlers, parameter, context) {
	// Parse the parameter
	var p = 0;

	// Check for extra parameters
	if (parameter.length > p) {
		config.macros.forEachTiddler.createExtraParameterErrorElement(place, "addToList", parameter, p);
		return;
	}

	// Perform the action.
	var list = document.createElement("ul");
	place.appendChild(list);
	for (var i = 0; i < tiddlers.length; i++) {
		var tiddler = tiddlers[i];
		var listItem = document.createElement("li");
		list.appendChild(listItem);
		createTiddlyLink(listItem, tiddler.title, true);
	}
};

abego.parseNamedParameter = function(name, parameter, i) {
	var beginExpression = null;
	if ((i < parameter.length) && parameter[i] == name) {
		i++;
		if (i >= parameter.length) {
			throw "Missing text behind '%0'".format([name]);
		}
		
		return config.macros.forEachTiddler.paramEncode(parameter[i]);
	}
	return null;
}

// Internal.
//
// --- The write Action ---------------------------------------------------
//
config.macros.forEachTiddler.actions.write.handler = function(place, tiddlers, parameter, context) {
	// Parse the parameter
	var p = 0;
	if (p >= parameter.length) {
		this.handleError(place, "Missing expression behind 'write'.");
		return;
	}

	var textExpression = config.macros.forEachTiddler.paramEncode(parameter[p]);
	p++;

	// Parse the "begin" option
	var beginExpression = abego.parseNamedParameter("begin", parameter, p);
	if (beginExpression !== null) 
		p += 2;
	var endExpression = abego.parseNamedParameter("end", parameter, p);
	if (endExpression !== null) 
		p += 2;
	var noneExpression = abego.parseNamedParameter("none", parameter, p);
	if (noneExpression !== null) 
		p += 2;

	// Parse the "toFile" option
	var filename = null;
	var lineSeparator = undefined;
	if ((p < parameter.length) && parameter[p] == "toFile") {
		p++;
		if (p >= parameter.length) {
			this.handleError(place, "Filename expected behind 'toFile' of 'write' action.");
			return;
		}
		
		filename = config.macros.forEachTiddler.getLocalPath(config.macros.forEachTiddler.paramEncode(parameter[p]));
		p++;
		if ((p < parameter.length) && parameter[p] == "withLineSeparator") {
			p++;
			if (p >= parameter.length) {
				this.handleError(place, "Line separator text expected behind 'withLineSeparator' of 'write' action.");
				return;
			}
			lineSeparator = config.macros.forEachTiddler.paramEncode(parameter[p]);
			p++;
		}
	}
	
	// Check for extra parameters
	if (parameter.length > p) {
		config.macros.forEachTiddler.createExtraParameterErrorElement(place, "write", parameter, p);
		return;
	}

	// Perform the action.
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(textExpression, context);
	var count = tiddlers.length;
	var text = "";
	if (count > 0 && beginExpression)
		text += config.macros.forEachTiddler.getEvalTiddlerFunction(beginExpression, context)(undefined, context, count, undefined);
	
	for (var i = 0; i < count; i++) {
		var tiddler = tiddlers[i];
		text += func(tiddler, context, count, i);
	}
	
	if (count > 0 && endExpression)
		text += config.macros.forEachTiddler.getEvalTiddlerFunction(endExpression, context)(undefined, context, count, undefined);

	if (count == 0 && noneExpression) 
		text += config.macros.forEachTiddler.getEvalTiddlerFunction(noneExpression, context)(undefined, context, count, undefined);
		

	if (filename) {
		if (lineSeparator !== undefined) {
			lineSeparator = lineSeparator.replace(/\\n/mg, "\n").replace(/\\r/mg, "\r");
			text = text.replace(/\n/mg,lineSeparator);
		}
		saveFile(filename, convertUnicodeToUTF8(text));
	} else {
		var wrapper = createTiddlyElement(place, "span");
		wikify(text, wrapper, null/* highlightRegExp */, context.inTiddler);
	}
};


// ---------------------------------------------------------------------------
//  Helpers
// ---------------------------------------------------------------------------

// Internal.
//
config.macros.forEachTiddler.createContext = function(placeParam, whereClauseParam, sortClauseParam, sortAscendingParam, actionNameParam, actionParameterParam, scriptText, tiddlyWikiPathParam, inTiddlerParam) {
	return {
		place : placeParam, 
		whereClause : whereClauseParam, 
		sortClause : sortClauseParam, 
		sortAscending : sortAscendingParam, 
		script : scriptText,
		actionName : actionNameParam, 
		actionParameter : actionParameterParam,
		tiddlyWikiPath : tiddlyWikiPathParam,
		inTiddler : inTiddlerParam, // the tiddler containing the <<forEachTiddler ...>> macro call.
		viewerTiddler : config.macros.forEachTiddler.getContainingTiddler(placeParam) // the tiddler showing the forEachTiddler result
	};
};

// Internal.
//
// Returns a TiddlyWiki with the tiddlers loaded from the TiddlyWiki of 
// the given path.
//
config.macros.forEachTiddler.loadTiddlyWiki = function(path, idPrefix) {
	if (!idPrefix) {
		idPrefix = "store";
	}
	var lenPrefix = idPrefix.length;
	
	// Read the content of the given file
	var content = loadFile(this.getLocalPath(path));
	if(content === null) {
		throw "TiddlyWiki '"+path+"' not found.";
	}
	
	var tiddlyWiki = new TiddlyWiki();

	// Starting with TW 2.2 there is a helper function to import the tiddlers
	if (tiddlyWiki.importTiddlyWiki) {
		if (!tiddlyWiki.importTiddlyWiki(content))
			throw "File '"+path+"' is not a TiddlyWiki.";
		tiddlyWiki.dirty = false;
		return tiddlyWiki;
	}
	
	// The legacy code, for TW < 2.2
	
	// Locate the storeArea div's
	var posOpeningDiv = content.indexOf(startSaveArea);
	var posClosingDiv = content.lastIndexOf(endSaveArea);
	if((posOpeningDiv == -1) || (posClosingDiv == -1)) {
		throw "File '"+path+"' is not a TiddlyWiki.";
	}
	var storageText = content.substr(posOpeningDiv + startSaveArea.length, posClosingDiv);
	
	// Create a "div" element that contains the storage text
	var myStorageDiv = document.createElement("div");
	myStorageDiv.innerHTML = storageText;
	myStorageDiv.normalize();
	
	// Create all tiddlers in a new TiddlyWiki
	// (following code is modified copy of TiddlyWiki.prototype.loadFromDiv)
	var store = myStorageDiv.childNodes;
	for(var t = 0; t < store.length; t++) {
		var e = store[t];
		var title = null;
		if(e.getAttribute)
			title = e.getAttribute("tiddler");
		if(!title && e.id && e.id.substr(0,lenPrefix) == idPrefix)
			title = e.id.substr(lenPrefix);
		if(title && title !== "") {
			var tiddler = tiddlyWiki.createTiddler(title);
			tiddler.loadFromDiv(e,title);
		}
	}
	tiddlyWiki.dirty = false;

	return tiddlyWiki;
};


	
// Internal.
//
// Returns a function that has a function body returning the given javaScriptExpression.
// The function has the parameters:
// 
//	 (tiddler, context, count, index)
//
config.macros.forEachTiddler.getEvalTiddlerFunction = function (javaScriptExpression, context) {
	var script = context["script"];
	var functionText = "var theFunction = function(tiddler, context, count, index) { return "+javaScriptExpression+"}";
	var fullText = (script ? script+";" : "")+functionText+";theFunction;";
	return eval(fullText);
};

// Internal.
//
config.macros.forEachTiddler.findTiddlers = function(whereClause, context, tiddlyWiki) {
	var result = [];
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(whereClause, context);
	tiddlyWiki.forEachTiddler(function(title,tiddler) {
		if (func(tiddler, context, undefined, undefined)) {
			result.push(tiddler);
		}
	});
	return result;
};

// Internal.
//
config.macros.forEachTiddler.createExtraParameterErrorElement = function(place, actionName, parameter, firstUnusedIndex) {
	var message = "Extra parameter behind '"+actionName+"':";
	for (var i = firstUnusedIndex; i < parameter.length; i++) {
		message += " "+parameter[i];
	}
	this.handleError(place, message);
};

// Internal.
//
config.macros.forEachTiddler.sortAscending = function(tiddlerA, tiddlerB) {
	var result = 
		(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) 
			? 0
			: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
			   ? -1 
			   : +1; 
	return result;
};

// Internal.
//
config.macros.forEachTiddler.sortDescending = function(tiddlerA, tiddlerB) {
	var result = 
		(tiddlerA.forEachTiddlerSortValue == tiddlerB.forEachTiddlerSortValue) 
			? 0
			: (tiddlerA.forEachTiddlerSortValue < tiddlerB.forEachTiddlerSortValue)
			   ? +1 
			   : -1; 
	return result;
};

// Internal.
//
config.macros.forEachTiddler.sortTiddlers = function(tiddlers, sortClause, ascending, context) {
	// To avoid evaluating the sortClause whenever two items are compared 
	// we pre-calculate the sortValue for every item in the array and store it in a 
	// temporary property ("forEachTiddlerSortValue") of the tiddlers.
	var func = config.macros.forEachTiddler.getEvalTiddlerFunction(sortClause, context);
	var count = tiddlers.length;
	var i;
	for (i = 0; i < count; i++) {
		var tiddler = tiddlers[i];
		tiddler.forEachTiddlerSortValue = func(tiddler,context, undefined, undefined);
	}

	// Do the sorting
	tiddlers.sort(ascending ? this.sortAscending : this.sortDescending);

	// Delete the temporary property that holds the sortValue.	
	for (i = 0; i < tiddlers.length; i++) {
		delete tiddlers[i].forEachTiddlerSortValue;
	}
};


// Internal.
//
config.macros.forEachTiddler.trace = function(message) {
	displayMessage(message);
};

// Internal.
//
config.macros.forEachTiddler.traceMacroCall = function(place,macroName,params) {
	var message ="<<"+macroName;
	for (var i = 0; i < params.length; i++) {
		message += " "+params[i];
	}
	message += ">>";
	displayMessage(message);
};


// Internal.
//
// Creates an element that holds an error message
// 
config.macros.forEachTiddler.createErrorElement = function(place, exception) {
	var message = (exception.description) ? exception.description : exception.toString();
	return createTiddlyElement(place,"span",null,"forEachTiddlerError","<<forEachTiddler ...>>: "+message);
};

// Internal.
//
// @param place [may be null]
//
config.macros.forEachTiddler.handleError = function(place, exception) {
	if (place) {
		this.createErrorElement(place, exception);
	} else {
		throw exception;
	}
};

// Internal.
//
// Encodes the given string.
//
// Replaces 
//	 "$))" to ">>"
//	 "$)" to ">"
//
config.macros.forEachTiddler.paramEncode = function(s) {
	var reGTGT = new RegExp("\\$\\)\\)","mg");
	var reGT = new RegExp("\\$\\)","mg");
	return s.replace(reGTGT, ">>").replace(reGT, ">");
};

// Internal.
//
// Returns the given original path (that is a file path, starting with "file:")
// as a path to a local file, in the systems native file format.
//
// Location information in the originalPath (i.e. the "#" and stuff following)
// is stripped.
// 
config.macros.forEachTiddler.getLocalPath = function(originalPath) {
	// Remove any location part of the URL
	var hashPos = originalPath.indexOf("#");
	if(hashPos != -1)
		originalPath = originalPath.substr(0,hashPos);
	// Convert to a native file format assuming
	// "file:///x:/path/path/path..." - pc local file --> "x:\path\path\path..."
	// "file://///server/share/path/path/path..." - FireFox pc network file --> "\\server\share\path\path\path..."
	// "file:///path/path/path..." - mac/unix local file --> "/path/path/path..."
	// "file://server/share/path/path/path..." - pc network file --> "\\server\share\path\path\path..."
	var localPath;
	if(originalPath.charAt(9) == ":") // pc local file
		localPath = unescape(originalPath.substr(8)).replace(new RegExp("/","g"),"\\");
	else if(originalPath.indexOf("file://///") === 0) // FireFox pc network file
		localPath = "\\\\" + unescape(originalPath.substr(10)).replace(new RegExp("/","g"),"\\");
	else if(originalPath.indexOf("file:///") === 0) // mac/unix local file
		localPath = unescape(originalPath.substr(7));
	else if(originalPath.indexOf("file:/") === 0) // mac/unix local file
		localPath = unescape(originalPath.substr(5));
	else // pc network file
		localPath = "\\\\" + unescape(originalPath.substr(7)).replace(new RegExp("/","g"),"\\");	
	return localPath;
};

// ---------------------------------------------------------------------------
// Stylesheet Extensions (may be overridden by local StyleSheet)
// ---------------------------------------------------------------------------
//
setStylesheet(
	".forEachTiddlerError{color: #ffffff;background-color: #880000;}",
	"forEachTiddler");

//============================================================================
// End of forEachTiddler Macro
//============================================================================


//============================================================================
// String.startsWith Function
//============================================================================
//
// Returns true if the string starts with the given prefix, false otherwise.
//
version.extensions["String.startsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.startsWith = function(prefix) {
	var n =  prefix.length;
	return (this.length >= n) && (this.slice(0, n) == prefix);
};



//============================================================================
// String.endsWith Function
//============================================================================
//
// Returns true if the string ends with the given suffix, false otherwise.
//
version.extensions["String.endsWith"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.endsWith = function(suffix) {
	var n = suffix.length;
	return (this.length >= n) && (this.right(n) == suffix);
};


//============================================================================
// String.contains Function
//============================================================================
//
// Returns true when the string contains the given substring, false otherwise.
//
version.extensions["String.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
String.prototype.contains = function(substring) {
	return this.indexOf(substring) >= 0;
};

//============================================================================
// Array.indexOf Function
//============================================================================
//
// Returns the index of the first occurance of the given item in the array or 
// -1 when no such item exists.
//
// @param item [may be null]
//
version.extensions["Array.indexOf"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.indexOf = function(item) {
	for (var i = 0; i < this.length; i++) {
		if (this[i] == item) {
			return i;
		}
	}
	return -1;
};

//============================================================================
// Array.contains Function
//============================================================================
//
// Returns true when the array contains the given item, otherwise false. 
//
// @param item [may be null]
//
version.extensions["Array.contains"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.contains = function(item) {
	return (this.indexOf(item) >= 0);
};

//============================================================================
// Array.containsAny Function
//============================================================================
//
// Returns true when the array contains at least one of the elements 
// of the item. Otherwise (or when items contains no elements) false is returned.
//
version.extensions["Array.containsAny"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAny = function(items) {
	for(var i = 0; i < items.length; i++) {
		if (this.contains(items[i])) {
			return true;
		}
	}
	return false;
};


//============================================================================
// Array.containsAll Function
//============================================================================
//
// Returns true when the array contains all the items, otherwise false.
// 
// When items is null false is returned (even if the array contains a null).
//
// @param items [may be null] 
//
version.extensions["Array.containsAll"] = {major: 1, minor: 0, revision: 0, date: new Date(2005,11,20), provider: "http://tiddlywiki.abego-software.de"};
//
Array.prototype.containsAll = function(items) {
	for(var i = 0; i < items.length; i++) {
		if (!this.contains(items[i])) {
			return false;
		}
	}
	return true;
};


} // of "install only once"

// Used Globals (for JSLint) ==============
// ... DOM
/*global 	document */
// ... TiddlyWiki Core
/*global 	convertUnicodeToUTF8, createTiddlyElement, createTiddlyLink, 
			displayMessage, endSaveArea, hasClass, loadFile, saveFile, 
			startSaveArea, store, wikify */
//}}}


/***
!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2005 ([[www.abego-software.de|http://www.abego-software.de]])

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.
***/
{{proctxt{
!!How it works
[>img[images/dnacol.png]]This procedure uses the GenElute kit from [[Sigma|http://www.sigma-aldrich.com]] to purify chromosomal DNA from Gram-positive or Gram-negative bacteria. Cells are lysed, proteins are removed by digestion with proteinase K (a relatively non-specific protease that breaks down proteins into small fragments), and chromosomal DNA is purified away from cellular components by binding it to an column. DNA binds the column as long as the buffer is high in salt; after washing the column, the DNA is eluted by simply adding a low-salt buffer.

!!Materials
{{proctab{
|GenElute kit for bacterial genomic DNA (Sigma)|
|Water bath or heating block at 55 &deg;C|
}}}
!!Procedure
*Grow an overnight culture of the desired bacterial strain in LB broth with shaking at 37 &deg;C.
*Heat water bath or heating block to 55 &deg;C.
*''If the GenElute kit is new'', prepare wash solution by adding the indicated volume of 100% ethanol to the wash solution concentrate provided. Be sure to mark the bottle to indicate that ethanol has been added.
*''If the GenElute kit is new'', prepare proteinase K by adding sterile dH~~2~~O directly to the proteinase K bottle to obtain a 20 mg/ml solution. Be sure to label the bottle to indicate that it's now a 20 mg/ml solution.
*Transfer 1.5 ml of culture```Typical yield should be 15-20 &mu;g for 1.5 ml of culture grown in LB broth. For cultures grown in Terrific Broth or other very rich media, reduce culture volume to 0.8 ml to avoid overloading column (should give same yield).``` to a microcentrifuge tube and pellet the cells by centrifuging 2 min at full speed in the microcentrifuge.
*Remove the supernatant thoroughly.
*Resuspend the pellet completely in Lysis Solution T by pipetting up and down```For Gram-positive bacteria, a lysozyme step is required. See the kit instructions for more information.```.
*Add 20 &mu;l of the RNAse A solution, mix and incubate 2 min at room temperature.
*Add 20 &mu;l of proteinase K solution, mix well and incubate 30 min. at 55 &deg;C.
*Add 200 &mu;l of Lysis Solution C, mix well and incubate 10 min. at 55 &deg;C.
*While samples are incubating, prepare a column for each sample by obtaining a binding column and adding 500 &mu;l of Column Preparation Solution to it.
*Place the column in a collection tube and centrifuge at full speed for 1 min. Discard the liquid that flows through the column.
*Add 200 &mu;l of ethanol to the cell lysate and mix by inverting 20 times.
*Transfer the lysate to the binding column (in the same collection tube) and centrifuge 1 min at 6500 &times; //g//.
*Move the binding column to a new collection tube, add 500 &mu;l of Wash Solution O and centrifuge 1 min at 6500 &times; //g//.
*Move the binding column to a new collection tube, add 500 &mu;l of Wash Solution (//not// Wash Solution O) and centrifuge 3 min at full speed.
*Move the binding column to a new collection tube, add 200 &mu;l of Elution Solution and centrifuge 1 min at 6500 &times; //g//.
*Store eluted DNA at ^^&ndash;^^20 &deg;C.
!!References
*For more information, see the <html><a href="docs/genelute genomic quick.pdf" target="_blank">quick protocol</a></html> or <html><a href="docs/genelute genomic full.pdf" target="_blank">full instructions</a></html> from Sigma.
}}}
// // Function to convert string to "proper" case
//{{{
function toProperCase(s) {
  return s.replace(/^(.)|\s(.)/g, function($1) { return $1.toUpperCase(); });
  };
//}}}

// // Function to convert string to "journal" case (proper case but with "small" words not capitalized):
//{{{
function journalCase(jname) {
  var temp = jname.split(" ");
  for (var i=1; i<temp.length; i++) {
    switch (temp[i]) {
      case "a","an","the","for","and","to","of":
        break;
      default:
        temp[i] = temp[i].replace(/^([a-z])/,function($1) { return $1.toUpperCase(); });
      }
    }
  return temp.join(" ");
  };
//}}}

// // Function to return an array with unique elements
//{{{
function getUniqueArray(myArray) {
  var o = {}, i, l = myArray.length, r = [];
  for(i=0; i<l;i+=1) o[myArray[i]] = myArray[i];
  for(i in o) r.push(o[i]);
  return r;
  };
//}}}

// // Function to return a string with all attributes of an element for debugging
//{{{
function getAtts(myObj) {
  outStr = "";
  for (var i in myObj) { outStr += "attrib " + i + ": " + myObj[i]; }
  return outStr;
  }
//}}}

// // Function to subtract one array from another
//{{{
function subtractArrays(startArray,toSubtract) {
  var strA = ":" + startArray.join("::") + ":";
  var strB = ":" +  toSubtract.join(":|:") + ":";
  var reg = new RegExp("(" + strB + ")","gi");
  var strDiff = strA.replace(reg,"").replace(/^:/,"").replace(/:$/,"");
  var arrDiff = strDiff.split("::");
  return arrDiff;
  }
//}}}

// // Function to filter a displayed table by any term
//{{{
function filter(query) {  
    query = jQuery.trim(query);
    query = query.replace(/ /gi, '|'); //multiple terms searched with OR
    jQuery("tbody tr").each(function() {  
      (jQuery(this).text().search(new RegExp(query, "i")) < 0) ? jQuery(this).hide().removeClass('visible') : jQuery(this).show().addClass('visible');  
      });
    };
//}}}

// // Case-insensitive string search with AND, OR or PHRASE matching
//{{{
function flexMatch(needle,haystack,how) {
  var haystack = haystack.toLowerCase();
  var needle = needle.toLowerCase();
  var how = how.toLowerCase();
  var foundIt = false;
  var searchTerms = needle.split(" ");
  switch (how) {
    case "or":
      for (var i=0; i<searchTerms.length; i++) {
        if ( haystack.indexOf(searchTerms[i]) > -1 ) { foundIt=true; break; }
        }
      break;
    case "and":
      foundIt=true;
      for (var i=0; i<searchTerms.length; i++) {
        if ( haystack.indexOf(searchTerms[i]) == -1 ) { foundIt=false; break; }
        }
      break;
    default:
      if ( haystack.indexOf(needle) > -1 ) { foundIt=true; }
    }
  return foundIt;
  };
//}}}

// // Find all slices in a tiddler
//{{{
function findAllSlices(title) {
  var sliceRE = /(?:^([\'\/]{0,2})~?([\.\w]+)\:\1[\t\x20]*([^\n]+)[\t\x20]*$)|(?:^\|([\'\/]{0,2})~?([\.\w]+)\:?\4\|[\t\x20]*([^\n]+)[\t\x20]*\|$)/gm;
  sliceRE.lastIndex = 0;
  var text = store.getTiddler(title).text
  var slices = {};
  var m = sliceRE.exec(text);
  while(m) {
    if(m[2])
      slices[m[2]] = m[3];
    else
      slices[m[5]] = m[6];
    m = sliceRE.exec(text);
    }
  return slices;
  }
//}}}

// // Truncate text to word break closest to given number of characters
//{{{
function truncate(text,length) {
  if ( text.length <= length ) { return text; }
  else {
    findBreaks = [];
    nextPos = 0;
    while ( text.indexOf(" ",nextPos) > -1 ) {
      findBreaks.push(text.indexOf(" ",nextPos));
      nextPos = text.indexOf(" ",nextPos) + 1;
      }
    nextPos = text.length;
    for ( var i=0; i<findBreaks.length; i++ ) {
      if ( Math.abs(length-findBreaks[i]) < Math.abs(length-nextPos) ) { nextPos = findBreaks[i]; }  
      }
    if ( nextPos < text.length ) { length = nextPos; }
    return text.substr(0,length) + "...";
    }
  }
//}}}

// // Functions to play/pause SWF movie
//{{{
function getFlashObject(flashName) {
  if (window.document[flashName]) { return window.document[flashName]; }
  if (navigator.appName.indexOf("Microsoft Internet")==-1) {
    if (document.embeds && document.embeds[flashName]) { return document.embeds[flashName]; }
    }
  else { return document.getElementById(flashName); }
  }

function pauseFlash(flashName) {
  var swfObj = getFlashObject(flashName);
  swfObj.StopPlay();
  }

function playFlash(flashName) {
  var swfObj = getFlashObject(flashName);
  swfObj.Play();
  }
//}}}
|a_fragment|Residues 6-59 of the //E. coli// LacZ protein, capable of interacting with the &omega;-fragment and producing active &beta;-galactosidase even when the two peptides are synthesized separately.|
|aggregation|Unfolded proteins tend to clump together (aggregate) because hydrophobic amino acids are exposed. Aggregation is thus one measure of unfolded protein.|
|aldehyde|A carbonyl carbon bonded to another carbon on one side and a hydrogen on the other. [img[gimages/aldehyde.png]]|
|antibody|A protein with two highly specific binding sites allowing it to bind a particular molecule known as an antigen. Antibodies are normally produced by the immune system to defend against invading bacteria or viruses, but antibodies can be produced that are specific for a desired molecule by injecting that molecule into a rabbit or mouse and harvesting antibodies from its serum. [img[gimages/antibody.png]]|
|araBAD|Operon containing genes for arabinose utilization; the promoter is tightly "off" unless transcription is stimulated by an activator, AraC, bound to arabinose.|
|arabinose|A sugar that can be used as a carbon/energy source by //E. coli//; utilization is dependent on genes of the //araBAD// operon. [img[gimages/ara.png]]|
|ASM|American Society for Microbiology|
|asn|The amino acid asparagine (Asn or N)<br>[img[gimages/asnsm.png]]|
|asp|The amino acid aspartate (Asp or D)<br>[img[gimages/aspsm.png]]|
|attB|The site on the //E. coli// chromosome where the bacteriophage &lambda; naturally integrates, used in this study as a site at which foreign DNA can be integrated into the chromosome without harm to the bacterial cell.|
|b_galactosidase|An enzyme that hydrolyzes lactose into glucose + galactose; the product of the //lacZ// gene in //E. coli//.|
|b_gal_assay|Activity of &beta;-galactosidase is assayed //in vitro// by spectrophotometric measurement of production of yellow //o//-nitrophenol from //o//-nitrophenyl-&beta;-D-galactopyranoside (ONPG).|
|bacteriostatic|A bacteriostatic agent blocks bacterial growth but does not kill the cells; an example is the antibiotic tetracycline, which halts translation but does not kill cells directly.|
|baffle_flasks|Culture flasks with indentations at the bottom to increase aeration. [img[gimages/baffle.jpg]]|
|betaine| An amino-acid derivative produced by many organisms to protect cells from stress, particularly osmotic changes, drying and high temperature. [img[gimages/betaine.png]]|
|bioinformatics|An interdisciplinary field combining molecular biology and computer science, developing computational tools to investigate genes and genomes.|
|biotin|Vitamin B~~7~~, a small molecule needed for cell growth but also commonly used in molecular biology to detect molecules to which biotin can be linked. [img[gimages/biotin.png]]|
|BSA|Bovine serum albumin, a protein purified from the blood serum of cows and commonly used in molecular biology as a protein standard or a carrier protein.|
|carbonyl|a C=O group, such as in an aldehyde or ketone. [img[gimages/carbonyl.png]]|
|CAT|Chloramphenicol acetyltransferase, an enzyme giving resistance to chloramphenicol.|
|catalase|An enzyme that defends against reactive oxygen species by breaking down peroxide to O~~2~~ and H~~2~~O.|
|chaperon|A protein that assists in the folding or re-folding of other proteins. Examples include GroEL (Hsp60) and DnaK (Hsp70).|
|chronological_aging|The length of time an organism has lived, and the biological changes associated with that span of time.|
|conditioned_medium|Conditioned medium, or "spent" medium, is a growth medium in which bacteria have been grown, usually to saturation, and from which the bacteria have been removed by centrifugation or filtration.|
|conformational_damage|Unfolding (complete or partial) of a protein, caused by heat, changes in pH or salt, etc.|
|constitutive|Unregulated: when discussing gene expression, a gene which is always "on" (has no repressor or other regulatory factors to turn it off) is said to be ''constitutive''.|
|covalent_damage|Chemical alteration to the amino-acid sequence of the protein, such as isoAsp formation, oxidation, proline isomerization, etc.|
|data_mining|Use of computational tools to derive new information from existing pools of data.|
|deamidation|Removal of an amino (NH~~3~~) group, as in the deamidation of Asn to form isoAsp.|
|definition|Popups give definitions and other explanations.|
|deleterious|harmful|
|de_novo|Literally, "from new;" //de novo// synthesis means made from scratch, such as a new protein made from amino acids rather than repair of an existing protein.|
|density_gradient|A method of separating cells, organelles or molecules based on their densities. When centrifuged through a solution forming a gradient of variable density, cells or molecules sediment at different rates and "float" when the reach the region of the tube where the density of the solution is the same as their own.|
|divergent|Oriented for transcription in opposite directions.|
|denaturing_stress|An environmental condition such as heat, high salt, oxidative stress, etc. that can potentially unfold proteins.|
|DNPH|2,4-dinitrophenylhydrazine [img[gimages/DNPH.png]]|
|exogenous|Externally added or produced, such as an amino acid added to supplement growth, as opposed to being produced by the cell (endogenous).|
|ELISA|__E__nzyme-__L__inked __I__mmunosorbent __A__ssay&mdash;a technique in which an antibody is used to detect a specific protein or other molecule, typically in a 96-well plate, and an enzyme bound to the antibody is in turn used to allow detection of the antibody by a spectrophotometer.|
|exonuclease|An enzyme that hydrolyzes a nucleic acid molecule starting from an end.|
|exp_phase|The part of the bacterial growth curve where nutrients are available and the bacteria are growing at the maximum rate for that medium; also called log phase. [img[gimages/growth.png]]|
|free_radical_theory|Theory that damage to macromolecules due to reactive oxygen species (ROS) is a major cause of senescence and aging.|
|GFP|Green fluorescent protein, a fluorescent protein produced by jellyfish.|
|glossary|Words shown in gray have glossary entries providing a definition or additional information.|
|heterologous|A gene or protein introduced to a cell in which it does not occur naturally.|
|homologous|Strictly speaking, homology means evolutionary relatedness. However, the term is used loosely to mean any two related sequences, such as in homologous recombination.|
|HPLC|High-Pressure (or High Performance) Liquid Chromatography separates molecules by taking advantage of their differential affinity for a chromatography column (the stationary phase) in a particular buffer (the mobile phase).|
|HRP|Horseradish peroxidase, an enzyme that catalyzes the breakdown of peroxide (H~~2~~O~~2~~) and is often used in molecular biology as a detection reagent for ELISA or Western blots because substrates such as TMB yield colored products detectable by spectrophotometry.|
|//in_vivo//|In the living cell (as opposed to ''//in vitro//'', an experiment conducted outside a living organism under controlled conditions).|
|//in_vitro//|Outside a living organism, under controlled conditions.|
|induce|In gene expression, to turn on a gene, such as by removing a repressor or adding an activator.|
|IPTG|Isopropyl ß-D-1-thiogalactopyranoside is an analog of lactose. It binds to the //lac// repressor of //E. coli// and thus induces transcription from the //lac// operon promoter but is not broken down by &beta;-galactosidase. It is thus a ''gratuitous inducer'' and is commonly used to induce expression of any gene cloned downstream of a //lac// promoter/operator sequence. [img[gimages/IPTG.png]]|
|isoasp|Isoaspartate (isoAsp) is formed by spontaneous isomerization of Asp or deamidation and isomerization of Asn<br>[img[gimages/isoaspsm.jpg]]|
|ketone|A carbonyl carbon bonded to another carbon on both sides. [img[gimages/carbonyl.png]]|
|knockout_mice|Genetically engineered mice which are either heterozygous or homozygous for a deletion that makes some specific gene non-functional.|
|lag_phase|An initial period after bacteria are added to fresh media in which their numbers don't increase; cells are adapting to the medium and conditions during this period. [img[gimages/growth.png]]|
|lysate|A suspension of proteins, DNA and other cell contents produced by breaking open (lysing) cells.|
|lysis|Breaking open of cells.|
|methionine|Amino acid methionine (Met, M). [img[gimages/met.png]]|
|NcoI|A restriction endonuclease with the recognition sequence 5'-C&darr;CATGG.|
|NCUR|National Conference on Undergraduate Research|
|osmoprotectants|Molecules such as betaine used to counter osmotic changes and maintain osmotic balance in the cell.|
|paraquat|A recyclable generator of reactive oxygen species. [img[gimages/paraquat.png]]|
|pcm|The L-isoaspartyl protein carboxyl methyltransferase [img[gimages/pcmsm.png]]|
|periplasm|Gram-negative bacteria, including //E. coli//, have two membranes. The region between the inner and outer membranes is the periplasm, or periplasmic space, where specific proteins reside. [img[gimages/fracsm.png]]|
|perl|A computer language valuable for its text-processing tools and commonly used to write programs to deal with DNA and protein sequences.|
|persisters|A sub-population of cells that are not genetically antibiotic-resistant but have a low level of metabolic activity and thus tolerant of many antibiotics|
|protease|An enzyme that breaks down other proteins.|
|pseudogene|A recognizable gene present in a genome but unable to be expressed. Pseudogenes may result from reverse transcription of mRNA or from mutation.|
|racemization|Conversion of a chiral molecule from one optically distinct form to the other (D to L or vice-versa).|
|reproductive_aging|Declining ability to reproduce as an organism ages.|
|residue|A general term for the amino-acid subunits of a protein or the nucleotide subunits of a nucleic acid.|
|ROS|Sometimes called "oxygen radicals" or "free radicals," reactive oxygen species (ROS) are forms of oxygen that can readily oxidize proteins, DNA or lipids. Major ROS are peroxide (H~~2~~O~~2~~), superoxide (O~~2~~^^&ndash;^^), the hydroxide ion (OH^^&ndash;^^) and the hydroxyl radical (HO&bull;).|
|SAM|S-adenosylmethonine (SAM or AdoMet) provides the methyl (CH~~3~~) group that PCM transfers to an isoAsp residue; SAM is the methyl donor for most methylation reactions in the cell. [img[gimages/sam.png]]|
|SAH|S-adenosylhomocysteine (SAH or AdoHcy) is the product when the methyl group is removed from SAM in a methylation reaction. [img[gimages/sah.png]]|
|stat_phase|The period in the bacterial growth curve where nutrients are exhausted and cell division slows or stops. [img[gimages/growth.png]]|
|senescence|Gradual decline in normal function (of a cell or an organism) associated with aging.|
|streptavidin|a protein that binds to biotin with extremely high affinity.|
|structural_complementation|The ability of two separate segments of a protein to interact physically to yield a functional protein. For example, the C-terminal portion of //E. coli// &beta;-galactosidase forms only inactive dimers rather than active tetramers. The small N-terminal &alpha;-peptide (orange in the figure below) can bind the dimers and restore activity. [img[gimages/acomp.png]]|
|suicide_vector|A plasmid that is unable to replicate in a particular strain; if transformed into the srain, plasmid sequences can recombine with the chromosome but the plasmid cannot be maintained independently.|
|TMB|3,3&prime;,5,5&prime;-tetramethylbenzidine, a colorless molecule which can be oxidized during the reaction of H~~2~~O~~2~~ with horseradish peroxidase, yielding a blue product. [img[gimages/tmb.png]] |
|TCA|trichloroacetic acid, a reagent commonly used in molecular biology to precipitate proteins.|
|toxin_antitoxin|Toxin-antitoxin (TA) systems are commonly found in bacteria: expression of the toxin gene kills or inhibits the growth of any cell that does not also express the antitoxin gene.|
|transduction|Horizontal gene transfer by means of a bacteriophage.|
|trehalose|A disaccharide composed of two glucose molecules produced by many organisms to protect cells from stress, particularly heat-induced conformational changes to proteins. [img[gimages/trehalose.png]]|
|vector|A plasmid used to clone DNA of interest.|
|wild_type|Unmutated; typically refers to what is considered the "normal" or most common genotype or phenotype in a population.|
/*{{{*/
config.formatters.unshift({name:"glossary",match:"\\(\\(",lookaheadRegExp:/\(\((.*?)\((\^?)((?:.|\n)*?)\)\)\)/g,handler:function(w){
this.lookaheadRegExp.lastIndex=w.matchStart;
var _2=this.lookaheadRegExp.exec(w.source);
if(_2&&_2.index==w.matchStart){
var _3=createTiddlyElement(w.output,"span",null,"annosub",_2[1]);
_3.anno="<"+"<tiddler [[Glossary::" +_2[3] + "]]>>";
_3.subject=_2[1];
_3.onmouseover=this.onmouseover;
_3.onmouseout=this.onmouseout;
_3.ondblclick=this.onmouseout;
w.nextMatch=_2.index+_2[0].length;
}
},onmouseover:function(e){
popup=createTiddlyElement(document.body,"div",null,"anno");
this.popup=popup;
if(this.subject){
wikify("!"+this.subject+"\n",popup);
}
wikify(this.anno,popup);
addClass(this,"annosubover");
Popup.place(this,popup,{x:25,y:7});
},onmouseout:function(e){
removeNode(this.popup);
this.popup=null;
removeClass(this,"annosubover");
}});
/*}}}*/
!!Adjusting pH###Blankenhorn1999###
|rectab|k
| !Growth condition```Base medium is LBK``` | !Buffer (100 mM) | !Oxygen | !pH```Initial pH; final pH after growth to mid-log changed by less than 0.3.``` | !Growth<br>time (h)```Time to reach OD~~600~~=0.35 to 0.5 at 37&deg;C```|
|Acid|HOMOPIPES or MES|+|4.4|13-20|
|||&ndash;|4.5|40-50|
|Neutral|PIPES or MOPS|+|7.0|1.7|
|||&ndash;|7.0|3|
|Base|AMPSO or TAPS|+|9.2|10-35|
|||&ndash;|9.0|24-48|
|Propionic acid|MES with 50 mM propionate|+|6.0|53|
|||&ndash;|6.2|24|
!!How it works###Farrar2002######Schurter2000######Carlson2000######Aswad1994######Wang2001###```[[Promega ISOQUANT kit instructions|docs/isoquant.pdf]]```
<<icap "[>img[Reverse-phase HPLC separates molecules in an injected sample<br>by their interaction with a non-polar matrix in a column<br>as a polar solvent is passed through the column under pressure.|images/hplc.png]]">>When [G[PCM|pcm]] methylates an [G[isoAsp|isoasp]], it uses a methyl group donated by [G[SAM|SAM]], converting the SAM to [G[SAH|SAH]]. Thus, one can measure PCM activity by providing SAM and an isoAsp-containing substrate and measuring the increase in SAH over time. Alternatively, the amount of isoAsp in a protein sample can be quantitated by adding purified PCM and SAM and again measuring SAH production.

SAH production can be measured using [G[HPLC|HPLC]], a form of chromatography in which molecules carried by an aqueous solution (mobile phase) pass through a column (stationary phase) and have the opportunity to interact with it. In reverse-phase HPLC, the column contains a non-polar matrix and the mobile phase is relatively polar, so more polar molecules pass through the column faster, while non-polar molecules interact with the column and are retained longer.

After passing through the column, molecules are detected by their ability to absorb UV light, resulting in peaks on a chromatogram. A particular molecule will elute after a particular amount of time from a given column with a given mobile phase. So, after comparison with known standards, a molecule such as SAH can be identified by its retention time and quantitated by its peak area.

!!Materials
{{proctab{
|[[Mobile phase A]]|||
|Mobile phase B (100% acetonitrile)|||
|SAM stock solution```Use extinction coefficient of 15,400 M at 254 nm wavelength to calculate exact concentration of SAM or SAH stock.```|1 mM|1 &mu;l per reaction|
|SAH stock solution```Use extinction coefficient of 15,400 M at 254 nm wavelength to calculate exact concentration of SAM or SAH stock.```|30 &mu;M |10 &mu;l per assay, as a standard|
|Purified recombinant human PCM```Not required for PCM activity assay.```||10 &mu;l per reaction|
|isoAsp-containing peptide```Not required for isoAsp assay.``` (e.g., isoAsp-DSIP```W-A-G-G-isoD-A-S-G-E```)|7.5 &mu;M|10 &mu;l per reaction|
|Reaction buffer```0.5 M sodium phosphate (pH 6.8), 5 mM EGTA, 0.02% sodium azide, 0.8% Triton X-100```|5x|10 &mu;l per reaction|
|Stop solution (phosphoric acid|0.3 M|10 &mu;l per reaction|
|[[Methyltransferase assay buffer]]||10.5 ml per sample|
{{proctxt{
!!Preparation of denatured cell lysates
*Transfer 5 ml of culture to be tested to a centrifuge tube
*Centrifuge 5 min. at 5,000 &times; //g// and 4 &deg;C. //Keep on ice throughout remainder of procedure!//
*Wash pellet by resuspending in 10 ml of methyltransferase assay buffer lacking PMSF and DTT and repeating the centrifugation.
*Repeat wash step
*Resuspend pellet in 0.5 ml of methyltransferase assay buffer (including PMSF and DTT) and transfer to a microcentrifuge tube
*Freeze at &ndash;80 &deg;C for 10 min (can be stored indefinitely at this stage)
*Thaw in a water bath
*Sonicate: 4 rounds of 10 1-second pulses at 40% power; keep on ice between rounds
*Centrifuge at full speed in refrigerated microcentrifuge (at 4 &deg;C) for 40 min. to pellet membranes and unbroken cells
*Transfer clear lysate (supernatant) to a clean tube (can be stored at &ndash;80 &deg;C at this stage)
*Determine total protein concentration using [[TCA-Lowry protein assay |Lowry protein assay]]
!!HPLC program
*Use an Aquasil C-18 column
*Equilibrate the column with 100% mobile phase A at a flow rate of 1 ml/min
*Program the HPLC for the following profile, maintaining 1 ml/min flow rate throughout:
|rectable|k
|!step|!start time|!end time|!%B at start|!%B at end|
|1|0 min|16 min|0%|16%|
|2|16 min|25 min|16%|21%|
|3|25 min|28 min|21%|95%|
|4|28 min|33 min|95%|95%|
|5|33 min|60 min|95%|0%|
*Expected retention time for SAH under these conditions is 12-14 min., with SAM eluting about 2 min. later
*Column can be washed with 100% methanol when necessary to remove any residual detergent (from the 5&times; reaction buffer).
!!Determination of PCM activity in cell extracts
*Prepare duplicate SAH standards by adding 10 &mu;l of 30 &mu;M stock solution to 50 &mu;l of Milli-Q water; this will give 100 pmol in a 20-&mu;l injection volume
*Determine the total amount of 1 mM SAM needed (1 &mu;l per reaction) and prepare a 0.1 mM stock by adding 9 &mu;l Milli-Q water for each 1 &mu;l SAM in a microcentrifuge tube.
*Thaw the isoAsp peptide standard, vortex to mix, then spin briefly in microcentrifuge
*Prepare enough master mix for all reactions to be performed (see table). Vortex, then spin briefly. Keep on ice until ready to use.
|rectable|k
|!component|!amount<br>per reaction|
|5x reaction buffer| 10 &mu;l|
|0.1 mM SAM stock| 10 &mu;l|
|Milli-Q water| 10 &mu;l|
|isoAsp peptide| 10 &mu;l|
*Prepare a blank for each different cell extract with the following components (no isoAsp peptide)```The blank will allow the background amount of SAH produced as a result of the action of other endogenous methyltransferases to be determined```:
|rectable|k
|!component|!amount<br>per reaction|
|5x reaction buffer| 10 &mu;l|
|0.1 mM SAM stock| 10 &mu;l|
|Milli-Q water| 20 &mu;l|
|cell extract| 10 &mu;l|
*Prepare samples by mixing 10 &mu;l of cell extract with 40 &mu;l of master mix. Cap tightly, mix thoroughly and place in a water bath at 30 &deg;C to start the reaction.
*Incubate each sample and blank exactly 30 min.```In order to ensure the incubation time is the same for all samples, add the master mix to the samples at 30-second intervals, then add the stop solution at the same intervals.```
*Add 10 &mu;l of stop solution to each sample and blank
*Spin the tubes 1 min. in a microcentrifuge at 4 &deg;C to bring all liquid and any precipitate to the bottom. Keep on ice in the dark until ready to assay. Store at &ndash;20 &deg;C if samples won't be assayed the same day.
*Inject 20 &mu;l of SAH standard and compare peak area to standard curve. Recalibrate with additional standards if needed.
*Inject 20 &mu;l of the blank in duplicate
*Inject 20 &mu;l of each sample in duplicate
!!Quantitation of isoAsp in cell extracts
*Prepare duplicate SAH standards by adding 10 &mu;l of 30 &mu;M stock solution to 50 &mu;l of Milli-Q water; this will give 100 pmol in a 20-&mu;l injection volume
*Determine the total amount of 1 mM SAM needed (1 &mu;l per reaction) and prepare a 0.1 mM stock by adding 9 &mu;l Milli-Q water for each 1 &mu;l SAM in a microcentrifuge tube.
*Thaw the recombinant human PCM, vortex to mix, then spin briefly in microcentrifuge
*Prepare enough master mix for all reactions to be performed (see table). Vortex, then spin briefly. Keep on ice until ready to use.
|rectable|k
|!component|!amount<br>per reaction|
|5x reaction buffer| 10 &mu;l|
|0.1 mM SAM stock| 10 &mu;l|
|Milli-Q water| 10 &mu;l|
|recombinant human PCM| 10 &mu;l|
*Prepare a blank for each different cell extract with the following components (no PCM)```The blank will allow the background amount of SAH produced as a result of the action of endogenous methyltransferases to be determined```:
|rectable|k
|!component|!amount<br>per reaction|
|5x reaction buffer| 10 &mu;l|
|0.1 mM SAM stock| 10 &mu;l|
|Milli-Q water| 20 &mu;l|
|cell extract| 10 &mu;l|
*Prepare samples by mixing 10 &mu;l of cell extract with 40 &mu;l of master mix. Cap tightly, mix thoroughly and place in a water bath at 30 &deg;C to start the reaction.
*Incubate each sample and blank exactly 30 min.```In order to ensure the incubation time is the same for all samples, add the master mix to the samples at 30-second intervals, then add the stop solution at the same intervals.```
*Add 10 &mu;l of stop solution to each sample and blank
*Spin the tubes 1 min. in a microcentrifuge at 4 &deg;C to bring all liquid and any precipitate to the bottom. Keep on ice in the dark until ready to assay. Store at &ndash;20 &deg;C if samples won't be assayed the same day.
*Inject 20 &mu;l of SAH standard and compare peak area to standard curve. Recalibrate with additional standards if needed.
*Inject 20 &mu;l of the blank in duplicate
*Inject 20 &mu;l of each sample in duplicate 
!!Analysis
*Use SAH standard curve to determine the amount of SAH present in each sample and blank.
*Average the two injections for each sample.
*Average the two injections for corresponding blank. Subtract this value from the amount of SAH in the corresponding sample.
*Use the Lowry assay to determine the amount of total protein in each sample.
*Calculate the total amount of protein in each actual injection.
*Report PCM activity as pmol SAH produced per mg total protein.
*Report isoAsp concentration as pmol isoAsp per mg total protein.
}}}
/***
|Name|HTMLFormattingPlugin|
|Source|http://www.TiddlyTools.com/#HTMLFormattingPlugin|
|Documentation|http://www.TiddlyTools.com/#HTMLFormattingPluginInfo|
|Version|2.4.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|embed wiki syntax formatting inside of HTML content|
The ~HTMLFormatting plugin allows you to ''mix wiki-style formatting syntax within HTML formatted content'' by extending the action of the standard TiddlyWiki formatting handler.
!!!!!Documentation
>see [[HTMLFormattingPluginInfo]]
!!!!!Revisions
<<<
2009.01.05 [2.4.0] in wikifyTextNodes(), pass w.highlightRegExp and w.tiddler to wikify() so that search term highlighting and tiddler-relative macro processing will work
| see [[HTMLFormattingPluginInfo]] for additional revision details |
2005.06.26 [1.0.0] Initial Release (as code adaptation - pre-dates TiddlyWiki plugin architecture!!)
<<<
!!!!!Code
***/
//{{{
version.extensions.HTMLFormattingPlugin= {major: 2, minor: 4, revision: 0, date: new Date(2009,1,5)};

// find the formatter for HTML and replace the handler
initHTMLFormatter();
function initHTMLFormatter()
{
	for (var i=0; i<config.formatters.length && config.formatters[i].name!="html"; i++);
	if (i<config.formatters.length)	config.formatters[i].handler=function(w) {
		if (!this.lookaheadRegExp)  // fixup for TW2.0.x
			this.lookaheadRegExp = new RegExp(this.lookahead,"mg");
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			var html=lookaheadMatch[1];
			// if <nowiki> is present, just let browser handle it!
			if (html.indexOf('<nowiki>')!=-1)
				createTiddlyElement(w.output,"span").innerHTML=html;
			else {
				// if <hide linebreaks> is present, suppress wiki-style literal handling of newlines
				if (html.indexOf('<hide linebreaks>')!=-1) html=html.replace(/\n/g,' ');
				// remove all \r's added by IE textarea and mask newlines and macro brackets
				html=html.replace(/\r/g,'').replace(/\n/g,'\\n').replace(/<</g,'%%(').replace(/>>/g,')%%');
				// create span, let browser parse HTML
				var e=createTiddlyElement(w.output,"span"); e.innerHTML=html;
				// then re-render text nodes as wiki-formatted content
				wikifyTextNodes(e,w);
			}
			w.nextMatch = this.lookaheadRegExp.lastIndex; // continue parsing
		}
	}
}

// wikify #text nodes that remain after HTML content is processed (pre-order recursion)
function wikifyTextNodes(theNode,w)
{
	function unmask(s) { return s.replace(/\%%\(/g,'<<').replace(/\)\%%/g,'>>').replace(/\\n/g,'\n'); }
	switch (theNode.nodeName.toLowerCase()) {
		case 'style': case 'option': case 'select':
			theNode.innerHTML=unmask(theNode.innerHTML);
			break;
		case 'textarea':
			theNode.value=unmask(theNode.value);
			break;
		case '#text':
			var txt=unmask(theNode.nodeValue);
			var newNode=createTiddlyElement(null,"span");
			theNode.parentNode.replaceChild(newNode,theNode);
			wikify(txt,newNode,highlightHack,w.tiddler);
			break;
		default:
			for (var i=0;i<theNode.childNodes.length;i++)
				wikifyTextNodes(theNode.childNodes.item(i),w); // recursion
			break;
	}
}
//}}}
/***
|Name:|HideWhenPlugin|
|Description:|Allows conditional inclusion/exclusion in templates|
|Version:|3.1 ($Rev: 3919 $)|
|Date:|$Date: 2008-03-13 02:03:12 +1000 (Thu, 13 Mar 2008) $|
|Source:|http://mptw.tiddlyspot.com/#HideWhenPlugin|
|Author:|Simon Baird <simon.baird@gmail.com>|
|License:|http://mptw.tiddlyspot.com/#TheBSDLicense|
For use in ViewTemplate and EditTemplate. Example usage:
{{{<div macro="showWhenTagged Task">[[TaskToolbar]]</div>}}}
{{{<div macro="showWhen tiddler.modifier == 'BartSimpson'"><img src="bart.gif"/></div>}}}
***/
//{{{

window.hideWhenLastTest = false;

window.removeElementWhen = function(test,place) {
	window.hideWhenLastTest = test;
	if (test) {
		removeChildren(place);
		place.parentNode.removeChild(place);
	}
};


merge(config.macros,{

	hideWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( eval(paramString), place);
	}},

	showWhen: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !eval(paramString), place);
	}},

	hideWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAll(params), place);
	}},

	showWhenTagged: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAll(params), place);
	}},

	hideWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAny(params), place);
	}},

	showWhenTaggedAny: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAny(params), place);
	}},

	hideWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.tags.containsAll(params), place);
	}},

	showWhenTaggedAll: { handler: function (place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !tiddler.tags.containsAll(params), place);
	}},

	hideWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0]), place);
	}},

	showWhenExists: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !(store.tiddlerExists(params[0]) || store.isShadowTiddler(params[0])), place);
	}},

	hideWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.title == params[0], place);
	}},

	showWhenTitleIs: { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( tiddler.title != params[0], place);
	}},

	'else': { handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		removeElementWhen( !window.hideWhenLastTest, place);
	}}

});

//}}}
*Testing of 1121 for //pcm// phenotypes!
*Survival of PCM mutants in LB + 1-4% glycerol (Finkel ASM)
*Synthetic lethals: &Delta;//pcm// + barcode deletion set
*Microarray analysis of gene expression in long-term stationary phase (GCAT)
*Folding of RFP mutants
*Propidium iodide staining###Shi2007### and FACS (Allison Wilson) to separate viable/inviable bacteria
*PAO as an ROS generator, or NAC as an antioxidant?###Fanelus2008###
*Measure ROS with dichlorofluorescein diacetate (DCHF) probe (Molecular Probes): fluorescence proportional to ROS###Fanelus2008###
*Dilute starved cultures like an MPN in 96-well plate; use multiplate reader to take abs at intervals...are fewer pcm- cells capable of growing even at points where survival is not different?###Murakami2008###
*Effect of PCM on production of or response to EDF (NNWNN, required for //mazEF//-mediated cell death###Kolodkin-Gal2007######Kolodkin-Gal2008###
*Is cell death in LTSP under stress apoptotic? Is //differential// death of //pcm// mutants apoptotic? See JMB 220:583 (TA mutant?)
*Fluorescent reporter for persisters?
ref
reading
order
ordered
{{proctxt{
!!How it works```See [[comparison|http://pierce-endogen.com/Proteomics/browse.cfm?fldID=BE219700-9B95-43A1-A3DA-83800F1A0392]] of different protein assays and more info from Pierce```
Cupric sulfate and tartrate are reacted with proteins from lysed cells in an alkaline solution, forming copper-protein complexes. These copper complexes reduce a yellow reagent, the Folin-Ciocalteu Reagent, producing a blue color that can be measured using a spectrophotometer at 750 nm. The more protein, the more complexed copper and thus the more reduction of the reagent and the more blue color. A standard curve using protein solutions of known concentration is required in order to actually quantitate the protein present in the extract. [G[BSA|BSA]] is commonly used for the standard curve. In this procedure, the copper reagent has been optimized to improve stability and NaOH is added to ensure that the TCA is neutralized.

!!Materials
{{proctab{
|[[TCA|TCA (10%)]]| 10%|1 ml/sample|
|NaOH|1.5 M|50 &mu;l/sample|
|[[Lowry Reagent U]]||1 ml/sample|
|Folin-Ciocalteu reagent||50 &mu;l/sample|
|[[BSA standard|BSA protein standard]]|1 mg/ml|1.2 ml/assay|
}}}
!!Procedure###Lowry1951######Upreti2012###
*Set up standard curve by pipetting 0, 10, 20, 30, 40 and 50 &mu;l of 1 mg/ml BSA standard```Exact concentration of [[BSA standard|BSA protein standard]] should be determined spectrophotometrically.``` (0-50 &mu;g protein```Above 50 &mu;g, the curve may not be linear```) into microcentrifuge tubes in duplicate.
*Transfer desired amount```For E. coli crude extracts, 5-10 &mu;l of an extract made in 1/10 of the original culture volume will typically yield 20-50 &mu;g of protein for an overnight culture; try 15-30 &mu;l for an extract from an exponentially growing culture.``` of unknown samples```See chart of chemicals [[compatible|docs/lowry compatibility.pdf]] with the Lowry assay (TCA precipitation step resolves many compatibility problems, however)``` into microcentrifuge tubes in duplicate.
*Add 1 ml of 10% TCA to each standard and each sample. Let stand 10 min.
>>[G[TCA|TCA]] precipitates proteins, so this will allow most other molecules that might potentially interfere with the assay to be removed with the supernatant.
*Microcentrifuge 10 min. at full speed and remove supernatant by aspiration
*Add 50 &mu;l of 1.5 M NaOH to each pellet to neutralize TCA
*Add 1 ml of Lowry reagent U to each sample, mix and let stand 10 min.
*Dilute folin reagent 1:1 with dH~~2~~O```''@@color: red;Folin reagent must be freshly diluted just before use@@''``` and add 100 &mu;l to each sample, vortexing each tube immediately
*Transfer 100 &mu;l of each sample to a 96-well plate (to use the microplate reader) or entire volume to a semi-micro cuvette (to use the spectrophotometer)
*Read absorbance at 750 nm for each sample. Standards and samples should all be read within a 5-minute period, as color will continue to darken slowly.
*If unknowns are not in range of standards, change amounts of unknowns used and repeat.
!!Analysis
*Construct standard curve of absorbance vs. amount of BSA (in µg)
*Use equation of best-fit straight line to calculate amount of protein in each unknown sample tube
*Work backward to calculate the concentration of protein in each original sample.
}}}
/***
|''Name:''|abego.IncludePlugin|
|''Version:''|1.0.1 (2007-04-30)|
|''Type:''|plugin|
|''Source:''|http://tiddlywiki.abego-software.de/#IncludePlugin|
|''Author:''|Udo Borkowski (ub [at] abego-software [dot] de)|
|''Documentation:''|[[IncludePlugin Documentation|http://tiddlywiki.abego-software.de/#%5B%5BIncludePlugin%20Documentation%5D%5D]]|
|''Community:''|([[del.icio.us|http://del.icio.us/post?url=http://tiddlywiki.abego-software.de/index.html%23IncludePlugin]]) ([[Support|http://groups.google.com/group/TiddlyWiki]])|
|''Copyright:''|&copy; 2007 [[abego Software|http://www.abego-software.de]]|
|''Licence:''|[[BSD open source license (abego Software)|http://www.abego-software.de/legal/apl-v10.html]]|
|''~CoreVersion:''|2.1.3|
|''Browser:''|Firefox 1.5.0.9 or better; Internet Explorer 6.0|
***/
/***
This plugin's source code is compressed (and hidden). Use this [[link|http://tiddlywiki.abego-software.de/archive/IncludePlugin/Plugin-Include-src.1.0.0.js]] to get the readable source code.
***/
///%
if(!window.abego){window.abego={};}var invokeLater=function(_1,_2,_3){return abego.invokeLater?abego.invokeLater(_1,_2,_3):setTimeout(_1,_2);};abego.loadFile=function(_4,_5,_6){var _7=function(_8,_9,_a,_b,_c){return _8?_5(_a,_b,_9):_5(undefined,_b,_9,"Error loading %0".format([_b]));};if(_4.search(/^((http(s)?)|(file)):/)!=0){if(_4.search(/^((.\:\\)|(\\\\)|(\/))/)==0){_4="file://"+_4;}else{var _d=document.location.toString();var i=_d.lastIndexOf("/");_4=_d.substr(0,i+1)+_4;}_4=_4.replace(/\\/mg,"/");}loadRemoteFile(_4,_7,_6);};abego.loadTiddlyWikiStore=function(_f,_10,_11,_12){var _13=function(_14,_15){if(_12){_12(_14,"abego.loadTiddlyWikiStore",_15,_f,_11);}};var _16=function(_17,_18){var _19=_18.indexOf(startSaveArea);var _1a=_18.indexOf("<!--POST-BODY-END--"+">");var _1b=_18.lastIndexOf(endSaveArea,_1a==-1?_18.length:_1a);if((_19==-1)||(_1b==-1)){return config.messages.invalidFileError.format([_f]);}var _1c="<html><body>"+_18.substring(_19,_1b+endSaveArea.length)+"</body></html>";var _1d=document.createElement("iframe");_1d.style.display="none";document.body.appendChild(_1d);var doc=_1d.document;if(_1d.contentDocument){doc=_1d.contentDocument;}else{if(_1d.contentWindow){doc=_1d.contentWindow.document;}}doc.open();doc.writeln(_1c);doc.close();var _1f=doc.getElementById("storeArea");_17.loadFromDiv(_1f,"store");_1d.parentNode.removeChild(_1d);return null;};var _20=function(_21){_13("Error when loading %0".format([_f]),"Failed");_10(undefined,_f,_11,_21);return _21;};var _22=function(_23){_13("Loaded %0".format([_f]),"Done");_10(_23,_f,_11);return null;};var _24=function(_25,_26,_27,_28){if(_25===undefined){_20(_28);return;}_13("Processing %0".format([_f]),"Processing");var _29=config.messages.invalidFileError;config.messages.invalidFileError="The file '%0' does not appear to be a valid TiddlyWiki file";try{var _2a=new TiddlyWiki();var _2b=_16(_2a,_25);if(_2b){_20(_2b);}else{_22(_2a);}}catch(ex){_20(exceptionText(ex));}finally{config.messages.invalidFileError=_29;}};_13("Start loading %0".format([_f]),"Started");abego.loadFile(_f,_24,_11);};(function(){if(abego.TiddlyWikiIncluder){return;}var _2c="waiting";var _2d="loading";var _2e=1000;var _2f=-200;var _30=-100;var _31=-300;var _32;var _33=[];var _34={};var _35=[];var _36;var _37=[];var _38;var _39=function(){if(_32===undefined){_32=config.options.chkUseInclude===undefined||config.options.chkUseInclude;}return _32;};var _3a=function(url){return "No include specified for %0".format([url]);};var _3c=function(){var _3d=_35;_35=[];if(_3d.length){for(var i=0;i<_37.length;i++){_37[i](_3d);}}};var _3f;var _40=function(){if(_36!==undefined){clearInterval(_36);}_3f=0;var _41=function(){abego.TiddlyWikiIncluder.sendProgress("","","Done");};_36=setInterval(function(){_3f++;if(_3f<=10){return;}clearInterval(_36);_36=undefined;abego.TiddlyWikiIncluder.sendProgress("Refreshing...","","");refreshDisplay();invokeLater(_41,0,_2f);},1);};var _42=function(_43){var _44;for(var i=0;i<_33.length;i++){var _46=abego.TiddlyWikiIncluder.getStore(_33[i]);if(_46&&(_44=_43(_46,_33[i]))){return _44;}}};var _47=function(){if(!window.store){return invokeLater(_47,100);}var _48=store.fetchTiddler;store.fetchTiddler=function(_49){var t=_48.apply(this,arguments);if(t){return t;}if(config.shadowTiddlers[_49]!==undefined){return undefined;}if(_49==config.macros.newTiddler.title){return undefined;}return _42(function(_4b,url){var t=_4b.fetchTiddler(_49);if(t){t.includeURL=url;}return t;});};if(_33.length){_40();}};var _4e=function(){if(!window.store){return invokeLater(_4e,100);}var _4f=store.getTiddlerText("IncludeList");if(_4f){wikify(_4f,document.createElement("div"));}};var _50=function(_51){var _52=function(){var _53=store.forEachTiddler;var _54=function(_55){var _56={};var _57;var _58=function(_59,_5a){if(_56[_59]){return;}_56[_59]=1;if(_57){_5a.includeURL=_57;}_55.apply(this,arguments);};_53.call(store,_58);for(var n in config.shadowTiddlers){_56[n]=1;}_56[config.macros.newTiddler.title]=1;_42(function(_5c,url){_57=url;_5c.forEachTiddler(_58);});};store.forEachTiddler=_54;try{return _51.apply(this,arguments);}finally{store.forEachTiddler=_53;}};return _52;};var _5e=function(_5f,_60){return _5f[_60]=_50(_5f[_60]);};abego.TiddlyWikiIncluder={};abego.TiddlyWikiIncluder.setProgressFunction=function(_61){_38=_61;};abego.TiddlyWikiIncluder.getProgressFunction=function(_62){return _38;};abego.TiddlyWikiIncluder.sendProgress=function(_63,_64,_65){if(_38){_38.apply(this,arguments);}};abego.TiddlyWikiIncluder.onError=function(url,_67){displayMessage("Error when including '%0':\n%1".format([url,_67]));};abego.TiddlyWikiIncluder.hasPendingIncludes=function(){for(var i=0;i<_33.length;i++){var _69=abego.TiddlyWikiIncluder.getState(_33[i]);if(_69==_2c||_69==_2d){return true;}}return false;};abego.TiddlyWikiIncluder.getIncludes=function(){return _33.slice();};abego.TiddlyWikiIncluder.getState=function(url){var s=_34[url];if(!s){return _3a(url);}return typeof s=="string"?s:null;};abego.TiddlyWikiIncluder.getStore=function(url){var s=_34[url];if(!s){return _3a(url);}return s instanceof TiddlyWiki?s:null;};abego.TiddlyWikiIncluder.include=function(url,_6f){if(!_39()||_34[url]){return;}var _70=this;_33.push(url);_34[url]=_2c;var _71=function(_72,_73,_74,_75){if(_72===undefined){_34[url]=_75;_70.onError(url,_75);return;}_34[url]=_72;_35.push(url);invokeLater(_3c);};var _76=function(){_34[url]=_2d;abego.loadTiddlyWikiStore(url,_71,null,_38);};if(_6f){invokeLater(_76,_6f);}else{_76();}};abego.TiddlyWikiIncluder.forReallyEachTiddler=function(_77){var _78=function(){store.forEachTiddler(_77);};_50(_78).call(store);};abego.TiddlyWikiIncluder.getFunctionUsingForReallyEachTiddler=_50;abego.TiddlyWikiIncluder.useForReallyEachTiddler=_5e;abego.TiddlyWikiIncluder.addListener=function(_79){_37.push(_79);};abego.TiddlyWikiIncluder.addListener(_40);if(config.options.chkUseInclude===undefined){config.options.chkUseInclude=true;}config.shadowTiddlers.AdvancedOptions+="\n<<option chkUseInclude>> Include ~TiddlyWikis (IncludeList | IncludeState | [[help|http://tiddlywiki.abego-software.de/#%5B%5BIncludePlugin%20Documentation%5D%5D]])\n^^(Reload this ~TiddlyWiki to make changes become effective)^^";config.shadowTiddlers.IncludeState="<<includeState>>";var _7a=function(e,_7c,_7d){if(!anim||!abego.ShowAnimation){e.style.display=_7c?"block":"none";return;}anim.startAnimating(new abego.ShowAnimation(e,_7c,_7d));};abego.TiddlyWikiIncluder.getDefaultProgressFunction=function(){setStylesheet(".includeProgressState{\n"+"background-color:#FFCC00;\n"+"position:absolute;\n"+"right:0.2em;\n"+"top:0.2em;\n"+"width:7em;\n"+"padding-left:0.2em;\n"+"padding-right:0.2em\n"+"}\n","abegoInclude");var _7e=function(){var e=document.createElement("div");e.className="includeProgressState";e.style.display="none";document.body.appendChild(e);return e;};var _80=_7e();var _81=function(_82){removeChildren(_80);createTiddlyText(_80,_82);_7a(_80,true,0);};var _83=function(){invokeLater(function(){_7a(_80,false,_2e);},100,_30);};var _84=function(_85,_86,_87,url,_89){if(_87=="Done"||_87=="Failed"){_83();return;}if(_86=="abego.loadTiddlyWikiStore"){_3f=0;if(_87=="Processing"){_81("Including...");}}else{_81(_85);}};return _84;};abego.TiddlyWikiIncluder.setProgressFunction(abego.TiddlyWikiIncluder.getDefaultProgressFunction());config.macros.include={};config.macros.include.handler=function(_8a,_8b,_8c,_8d,_8e,_8f){_8c=_8e.parseParams("url",null,true,false,true);var _90=parseInt(getParam(_8c,"delay","0"));var _91=_8c[0]["url"];var _92=getFlag(_8c,"hide",false);if(!_92){createTiddlyText(createTiddlyElement(_8a,"code"),_8d.source.substring(_8d.matchStart,_8d.nextMatch));}for(var i=0;_91&&i<_91.length;i++){abego.TiddlyWikiIncluder.include(_91[i],_90);}};config.macros.includeState={};config.macros.includeState.handler=function(_94,_95,_96,_97,_98,_99){var _9a=function(){var s="";var _9c=abego.TiddlyWikiIncluder.getIncludes();if(!_9c.length){return "{{noIncludes{\nNo includes or 'include' is disabled (see AdvancedOptions)\n}}}\n";}s+="|!Address|!State|\n";for(var i=0;i<_9c.length;i++){var inc=_9c[i];s+="|{{{"+inc+"}}}|";var t=abego.TiddlyWikiIncluder.getState(inc);s+=t?"{{{"+t+"}}}":"included";s+="|\n";}s+="|includeState|k\n";return s;};var _a0=function(){removeChildren(div);wikify(_9a(),div);if(abego.TiddlyWikiIncluder.hasPendingIncludes()){invokeLater(_a0,500,_31);}};var div=createTiddlyElement(_94,"div");invokeLater(_a0,0,_31);};var _a2=Tiddler.prototype.isReadOnly;Tiddler.prototype.isReadOnly=function(){return _a2.apply(this,arguments)||this.isIncluded();};Tiddler.prototype.isIncluded=function(){return this.includeURL!=undefined;};Tiddler.prototype.getIncludeURL=function(){return this.includeURL;};var _a3={getMissingLinks:1,getOrphans:1,getTags:1,reverseLookup:1,updateTiddlers:1};for(var n in _a3){_5e(TiddlyWiki.prototype,n);}var _a5=function(){if(abego.IntelliTagger){_5e(abego.IntelliTagger,"assistTagging");}};var _a6=function(){if(config.macros.forEachTiddler){_5e(config.macros.forEachTiddler,"findTiddlers");}};_47();invokeLater(_4e,100);invokeLater(_a5,100);invokeLater(_a6,100);})();
//%/
!!EntrezAJAX
Entrez-AJAX developer ID = ac329f4b439fbca0d2e61cdd90a40509 (gave tool ID = refTW); [[website|http://entrezajax.appspot.com/]]

!!Data structure:
|>|>|>|>|PubMed|format/notes|refFields object in script|tiddler fields|format/notes|h
|>|>|>|>|MedlineCitation|||||
| |>|>|>|Article|||||
| | |>|>|Abstract|||||
| | | |>|AbstractText (array)|use AbstractTest(0)|abstract|abstract||
| | |>|>|Affiliation||authorAddress|adr|includes last author's last name|
| | |>|>|ArticleTitle||articleTitle|rtitle||
| | |>|>|AuthorList (array)|each author is array element||||
| | | |>|LastName|||||
| | | |>|ForeName|e.g., J E||||
| | | |>|Initials|e.g., JE||||
| | |>|>|Journal|||||
| | | |>|ISOAbbreviation|e.g., J. Bacteriol.|journalAbbr|journal||
| | | |>|Title|e.g., Journal of bacteriology|journalTitle|fjournal||
| | | |>|JournalIssue|||||
| | | | |Volume|||||
| | | | |Issue||issue|issue||
| | | | |PubDate|||||
| | | | |Year||pubDate|year|4-digit year|
| | |>|>|Pagination|||||
| | | |>|MedlinePgn|e.g., 2623-9|pages|pages|full pages|
| | |>|>|PublicationTypeList (array)||type|pubtype|Article or Review|
| |>|>|>|PMID||pmid|pmid||
|>|>|>|>|PubmedData|||||
| |>|>|>|ArticleIDList (array)|nn.nnnn/… for doi|doi|doi||
|>|>|>|>||PMCnnnnn for PubMedCentral|pmc|pmc||
|>|>|>|>|||firstAuthor|||
|>|>|>|>|||lastAuthor|||
|>|>|>|>|||authorList|alist|ASM formatted full author list|
|>|>|>|>|||shortAuthors|sauthors|e.g., Smith and Jones, Brown et al.|
|>|>|>|>|||fullCitation|fcite|ASM formatted full citation|
|>|>|>|>|||refID|title|e.g., Smith2010|
|>|>|>|>|||shortCitation|scite|e.g., J. Bacteriol. 126:2145-2148|
|>|>|>|>||||file|main topic/filename|

!!Code bits and misc
//{{{
// Old Function to get PubMed data - uses eSummary, no abstract (but could be useful in another context?)
// Delete if not used or save as a snippet somewhere
function queryPubMed(PMID,qmode,title) {
  var args  = { 'apikey' : 'ac329f4b439fbca0d2e61cdd90a40509',
	            'db' : 'pubmed',
	            'term' : PMID,
                    'retmax' : 1,    // maximum number of results from Esearch
                    'max' : 1,        // maximum number of results passed to Esummary
                    'start'  : 0
                    };
  jQuery.getJSON('http://entrezajax.appspot.com/esearch+esummary?callback=?', args, function(data) {
    if(data.entrezajax.error == true) {
      alert("EntrezAjax failed with error " + data.entrezajax.error_message);
      return;
      }
    if(data.entrezajax.count == 0) {
      alert("No records returned for PMID " + PMID);
      return;
    }
    jQuery.each(data.result, function(i, PMItem) {
      if (qmode == 0) { createNewPMID(PMID,PMItem); }
        else { updatePMID(PMID,PMItem,title); }
      });
    });
  };
//}}}
/***
|Name|InlineJavascriptPlugin|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Documentation|http://www.TiddlyTools.com/#InlineJavascriptPluginInfo|
|Version|1.9.5|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Insert Javascript executable code directly into your tiddler content.|
''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Documentation
>see [[InlineJavascriptPluginInfo]]
!!!!!Revisions
<<<
2009.04.11 [1.9.5] pass current tiddler object into wrapper code so it can be referenced from within 'onclick' scripts
2009.02.26 [1.9.4] in $(), handle leading '#' on ID for compatibility with JQuery syntax
|please see [[InlineJavascriptPluginInfo]] for additional revision details|
2005.11.08 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.InlineJavascriptPlugin= {major: 1, minor: 9, revision: 5, date: new Date(2009,4,11)};

config.formatters.push( {
	name: "inlineJavascript",
	match: "\\<script",
	lookahead: "\\<script(?: src=\\\"((?:.|\\n)*?)\\\")?(?: label=\\\"((?:.|\\n)*?)\\\")?(?: title=\\\"((?:.|\\n)*?)\\\")?(?: key=\\\"((?:.|\\n)*?)\\\")?( show)?\\>((?:.|\\n)*?)\\</script\\>",

	handler: function(w) {
		var lookaheadRegExp = new RegExp(this.lookahead,"mg");
		lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			var src=lookaheadMatch[1];
			var label=lookaheadMatch[2];
			var tip=lookaheadMatch[3];
			var key=lookaheadMatch[4];
			var show=lookaheadMatch[5];
			var code=lookaheadMatch[6];
			if (src) { // external script library
				var script = document.createElement("script"); script.src = src;
				document.body.appendChild(script); document.body.removeChild(script);
			}
			if (code) { // inline code
				if (show) // display source in tiddler
					wikify("{{{\n"+lookaheadMatch[0]+"\n}}}\n",w.output);
				if (label) { // create 'onclick' command link
					var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",wikifyPlainText(label));
					var fixup=code.replace(/document.write\s*\(/gi,'place.bufferedHTML+=(');
					link.code="function _out(place,tiddler){"+fixup+"\n};_out(this,this.tiddler);"
					link.tiddler=w.tiddler;
					link.onclick=function(){
						this.bufferedHTML="";
						try{ var r=eval(this.code);
							if(this.bufferedHTML.length || (typeof(r)==="string")&&r.length)
								var s=this.parentNode.insertBefore(document.createElement("span"),this.nextSibling);
							if(this.bufferedHTML.length)
								s.innerHTML=this.bufferedHTML;
							if((typeof(r)==="string")&&r.length) {
								wikify(r,s,null,this.tiddler);
								return false;
							} else return r!==undefined?r:false;
						} catch(e){alert(e.description||e.toString());return false;}
					};
					link.setAttribute("title",tip||"");
					var URIcode='javascript:void(eval(decodeURIComponent(%22(function(){try{';
					URIcode+=encodeURIComponent(encodeURIComponent(code.replace(/\n/g,' ')));
					URIcode+='}catch(e){alert(e.description||e.toString())}})()%22)))';
					link.setAttribute("href",URIcode);
					link.style.cursor="pointer";
					if (key) link.accessKey=key.substr(0,1); // single character only
				}
				else { // run script immediately
					var fixup=code.replace(/document.write\s*\(/gi,'place.innerHTML+=(');
					var c="function _out(place,tiddler){"+fixup+"\n};_out(w.output,w.tiddler);";
					try	 { var out=eval(c); }
					catch(e) { out=e.description?e.description:e.toString(); }
					if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);
				}
			}
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
	}
} )
//}}}

// // Backward-compatibility for TW2.1.x and earlier
//{{{
if (typeof(wikifyPlainText)=="undefined") window.wikifyPlainText=function(text,limit,tiddler) {
	if(limit > 0) text = text.substr(0,limit);
	var wikifier = new Wikifier(text,formatter,null,tiddler);
	return wikifier.wikifyPlain();
}
//}}}

// // GLOBAL FUNCTION: $(...) -- 'shorthand' convenience syntax for document.getElementById()
//{{{
if (typeof($)=='undefined') { function $(id) { return document.getElementById(id.replace(/^#/,'')); } }
//}}}
[[B-PER bacterial lysis reagent|docs/bper.pdf]]
[[GenElute genomic DNA purification|docs/genelute genomic full.pdf]]
[[GenElute quick protocol|docs/genelute genomic quick.pdf]]
[[IsoQuant kit for isoAsp quantitation|docs/isoquant.pdf]]
[[IsoQuant kit background information|docs/isoquant background.pdf]]
[[MicroPulser electroporation manual|docs/MicroPulser.pdf]]
[[TaKaRa Ex Taq HS|docs/takara ex taq hs.pdf]]
[[Owl semi-dry blotter|docs/owl semidry blotter.pdf]]
[[Biocell ELISA quantitation kit for protein carbonyls|docs/Biocell carbonyl ELISA.pdf]]
[G[Aspartate|asp]] (Asp) and [G[asparagine|asn]] (Asn), two of the 20 different amino acids that make up proteins, can spontaneously isomerize to form isoaspartate. This chemical reaction does not affect free amino acids, but can happen when Asp or Asn is part of a peptide (protein) chain&mdash;i.e., an aspartyl or asparaginyl residue. As shown below, the nitrogen in the peptide backbone (shown in blue) next to an Asp or Asn can attack the side-chain carbonyl carbon, forming a 5-member succinimide ring###Geiger1987###. Asn is [G[deamidated|deamination]] (loses an NH~~3~~) in the process.
[0I[Formation of succinimide from an Asp or Asn|wimages/succinimide.jpg]]
''Hydrolysis'' of this unstable succinimide intermediate occurs rapidly. As shown below, hydrolysis can occur on either side of the nitrogen in the succinimide ring. Hydrolysis on one side produces a normal Asp (though Asn cannot be regenerated, due to the deamidation). Hydrolysis on the other side (which is favored by about 3:1) produces isoaspartate.
[0I[Hydrolysis of succinimide to form Asp or isoAsp|wimages/hydrolysis.gif]]
''Protein activity'' could be impaired by this abnormal isoAsp residue in at least three ways###Clarke2003###. (i) The original Asp or Asn may have been located at the active site or another location crucial to the function of the protein; the difference in structure (and charge, for Asn) at this site could disrupt function. (ii) The original Asp or Asn may have been critical for the protein's 3D structure, so that [G[conformational damage|conformational_damage]] results. (iii) Notice that the peptide backbone (blue) now goes through what was previously the side-chain carbon; this "kink" could also disrupt protein structure.
[1<I[succinimide and isoAsp formation|wimages/isoaspform.png]]''Isoaspartate''. Our research is concerned with the chemical alteration of amino acids, which we refer to as [G[covalent protein damage|covalent_damage]]. Specifically, we focus on the spontaneous formation of [G[isoAsp|isoasp]] from normal [G[Asp|asp]] or [G[Asn|asn]] residues in proteins and the repair of isoAsp by [G[PCM|pcm]].

''Asp and Asn'' are particularly labile sites in proteins and are susceptible to spontaneous isomerization resulting from intramolecular attack###Clarke1992b### (see figure at left; also shown in the animation on the [[next page|Protein Repair and PCM]]). An unstable succinimide forms but quickly hydrolyzes, yielding either a normal Asp or an isoAsp residue, with isoAsp favored by about 3:1. If unrepaired, isoAsp can negatively affect the function of a protein in any of three ways###Clarke1992b###:
#changing the conformation of the protein by "kinking" the peptide backbone (blue line in the figure), which now passes through the β-carboxyl carbon
#altering an amino acid that participates directly in catalysis
#altering charge and other chemical properties by deamidation of Asn
''Effects''. The rate of isoAsp formation in histones of cultured mammalian cells is estimated at 1% of Asp and Asn per day###Young2001###, and the damage rate increases with aging###Barber1983###, suggesting that this form of covalent damage could have serious consequences&emdash;especially for aging or nutrient-limited cells where protein turnover is restricted. Indeed, negative effects of isoAsp damage have been demonstrated [G[//in vitro//|in_vitro]] for a variety of proteins###Clarke2003###, including calmodulin, calbindin, epidermal growth factor, histones, ribosomal proteins, tubulin and synapsin. Furthermore, connections have been identified between isoAsp damage and longevity###Kim1997###, &beta;-amyloid formation in Alzheimer's disease###Lowenson1994###, autoimmune responses###Doyle2003######Mamula1999###, hereditary spherocytosis###Ingrosso1995### and other diseases (see [[PCM vs Aging and Disease]] for more detail).
Journal of Bacteriology
Journal of Biological Chemistry
Molecular Microbiology
Nature Reviews Microbiology
|tableNoBord tableTight|k
|[img[icons/tinyi.png]] glossary|[img[icons/refIcon.png]] reference|
|[img[icons/linkIcon.png]] external link||
[1<I[Wade Hicks at Harvard|pimages/hicks.png]]
''Wade Hicks'' ('02) studied the effect of pH on survival of //pcm// mutants and accumulation of isoAsp. His work was presented at the General Meeting of the American Society for Microbiology[L[http://www.asm.org]] and published in //Microbiology//###Hicks2005### in 2005. After graduation, Wade worked as a technician with Dr. Adam Driks[L[http://www.stritch.luc.edu/lumen/deptwebs/microbio/adriks.php]] at Loyola University, then continued on to graduate school at Brandeis, where he received his PhD in 2010. Currently, he is a post-doc in the laboratory of Pam Silver[L[http://silver.med.harvard.edu]] at Harvard and studies bacterial fuel cells.
{{break{&nbsp;}}}
[1<I[Lyndsey Crampton|pimages/crampton.png]]
''Lyndsey Crampton'' ('03) worked with Matt Kotlajich on the effect of pH on long-term stress survival and also did preliminary work on the survival of //pcm// mutants in minimal medium at high pH. After graduation, she pursued a graduate degree in psychology at the University of Washington.
{{break{&nbsp;}}}
[1<I[Matt Kotlajich|pimages/kotlajich.png]]
''Matt Kotlajich'' ('03) continued Wade Hicks' work on the effect of pH on survival of //pcm// mutants and accumulation of isoAsp. He presented his work at the National Conferences on Undergraduate Research[L[http://www.ncur.org]] and co-authored a publication in //Microbiology//###Hicks2005###. After graduation, Matt spent a year at Northwestern University as a research technician before pursing PhD studies at the University of California at Irvine, where he studied mechanisms of RNA splicing.[L[http://mcb.asm.org/cgi/reprint/29/4/1072]] Matt is now a post-doc with Robert Landick[L[http://landick.wisc.edu]] at the University of Wisconsin on nucleoid proteins and their effect on transcription elongation.
{{break{&nbsp;}}}
[1<I[Toni Thomas|pimages/thomas.png]]
''Toni Thomas'' ('03) worked on a collaboration with local chemical company D. A. Stuart to investigate rapid, field-based techniques for quantitating contamination of metalworking fluids by //Mycobacterium// species. After graduation, Toni worked as D. A. Stuart's microbiologist for several years. She is currently preparing to pursue a career as a nurse-practitioner.
{{break{&nbsp;}}}
[1<I[Ana Shulla|pimages/shulla.png]]
''Ana Shulla'' ('04) worked on PCM as an independent project in our Biochemistry 465 Advanced Topics research course. She measured oxidized proteins in cells with and without PCM. Ana received a PhD from Loyola University of Chicago in 2011, where she worked with [[Tom Gallagher|http://www.meddean.luc.edu/lumen/DeptWebs/MICROBIO/labs/gallagher/gallagher-lab.php]] in the Department of Microbiology and Immunology, studying coronavirus entry into cells. She is now a post-doc at the University of Chicago.
{{break{&nbsp;}}}
[1<I[Sanda Vujnic as a medical student|pimages/vujnic.png]]
''Sanda Vujnic'' ('04) developed a protocol for measuring aggregated proteins in living cells as a way to estimate protein unfolding //in vivo//. She found higher levels of aggregated protein in aged, stressed cells lacking PCM. Sanda received a Richter fellowship[L[http://northcentralcollege.edu/x3564.xml]] to present her work at the General Meeting of the American Society for Microbiology[L[http://www.asm.org]] in New Orleans. Sanda graduated in 2008 from Ross University Medical School and is currently a resident in internal medicine at the Medical College of Wisconsin, with a sub-specialty in critical-care pulmonology.
{{break{&nbsp;}}}
[1<I[Lindsay Hill|pimages/hill.png]]
''Lindsay Hill'' ('05) worked on generation of chromosomal mutants by recombination-based techniques and conducted initial studies toward fractionation of //E. coli// proteins and measurement of isoaspartyl damage in various compartments. Lindsay graduated from the University of Wisconsin in 2010 with a PhD in Molecular and Cellular Pharmacology; her thesis focused on extracellular ATP as a signal of cellular damage[L[http://www.ncbi.nlm.nih.gov/pmc/articles/PMC2686823]]. Lindsay now has a post-doctoral position studying Ebola Virus interactions with host cells and vaccine strategies in the laboratory of Yoshi Kawoaka[L[http://www.vetmed.wisc.edu/people/kawaokay/]] at Wisconsin.
{{break{&nbsp;}}}
[1<I[T&eacute;a Boci|pimages/boci.png]]
''Téa Boci'' ('06) worked on construction of a chromosomal pcm mutation with no antibiotic resistance that can be combined with other interesting mutations. T&eacute;a is now a PhD student at the University of Illinois at Chicago.
{{break{&nbsp;}}}
[1<I[Brianne McNeal|pimages/mcneal.png]]
''Brianne McNeal'' ('06) looked for evidence that PCM affects protein folding by examining aggregated protein in long-term stationary-phase cultures. She also worked on the construction of a chromosomal //pcm// deletion. She was in the first group of summer research fellows funded by a grant from the [[Merck/AAAS Undergraduate Science Research Program|http://php.aaas.org/programs/education/merck/]]. Brianne now works for the EPA and the Department of Homeland Security.
{{break{&nbsp;}}}
[1<I[Madiha Salim|pimages/salim.png]]
''Madiha Salim'' ('06) completed the work begun by Wade Hicks and Matt Kotlajich on the role of pH in the stress-survival phenotypes of //pcm// mutants. She completed an honors thesis based on her work with fractionation of //E. coli// cells and measurement of protein damage in different cellular compartments. Madiha is now a medical student at the St. Matthews University School of Medicine.
{{break{&nbsp;}}}
[1<I[Bhumika Shah|pimages/shah.png]]
''Bhumika Shah'' ('06) studied oxidation in long-term stationary phase and optimized detection of oxidized proteins using a dot-blot technique. Bhumika graduated from dental school at the University of Illinois at Chicago in 2010 and is now a practicing dentist in the area.
{{break{&nbsp;}}}
[1<I[Adam Bussell (r) with Amber Cibrario|pimages/bussell.png]]
''Adam Bussell'' ('07) was a Merck/AAAS[L[http://php.aaas.org/programs/education/merck/]] fellow. He studied the effect of combining a mutation in //groEL// with a //pcm// mutation and also sought to develop an HPLC-based protocol for quantitating PCM activity and isoAsp damage. Adam is pursuing a PhD in Biology at Indiana University.
{{break{&nbsp;}}}
[1<I[Nicole Flinn|pimages/flinn.png]]
''Nicole Flinn'' ('07) constructed an //E. coli// strain marked with a chromosomal green fluorescent protein (GFP) gene, paving the way for competition studies as well as measurement of protein activity. She also experimented with dyes that might reveal the metabolic state of stationary-phase cells. Nicole now teaches biology at Romeoville High School.
{{break{&nbsp;}}}
[1<I[Megan Peiffer|pimages/peiffer.png]]
''Megan Peiffer'' ('07) looked at the effect of PCM on the rate of recovery from stationary phase. She found that //pcm// mutants have a much longer lag phase, suggesting that PCM is important during recovery. Her work contributed to a publication in //Microbiology// in 2005.###Hicks2005### She also worked on the construction of a chromosomal //pcm// mutant with no antibiotic-resistance marker.
{{break{&nbsp;}}}
[1<I[Matt Sorenson|pimages/sorenson.png]]
''Matt Sorenson'' ('07) a Merck/AAAS Research Fellow,[L[http://php.aaas.org/programs/education/merck]] separated viable and inviable stationary-phase cells by density, to investigate whether PCM is more active in the viable fraction. Matt is a PhD student in the laboratory of Scott Stevens[L[http://www.icmb.utexas.edu/cmb/directory/details.asp?id=1807]] at the University of Texas, exploring RNA splicing in //Saccharomyces cerevisiae//.
{{break{&nbsp;}}}
[1<I[Casey Connolly|pimages/connolly.png]]
''Casey Connolly'' ('08) measured aggregated protein to determine the effect of PCM on bulk unfolded protein in cells. She found that stressed PCM mutants accumulate more aggregated protein //in vivo// and presented her work at the General Meeting of the American Society for Microbiology[L[http://www.asm.org]] in Boston. Casey works in the health-care industry at Central DuPage Hospital.
{{break{&nbsp;}}}
[1<I[Dani Kleehammer|pimages/kleehammer.png]]
''Dani Kleehammer'' ('08) got her feet wet in research by working in the lab during D-term. She collaborated with T&eacute;a Boci to construct a new //pcm// mutant in the chromosome. Dani has worked in the area of nuclear medicine and is now in a physician assistant program.
{{break{&nbsp;}}}
[1<I[Heather Peterson|pimages/peterson.png]]
''Heather Peterson'' ('08) looked for effects of a //pcm// mutation on the amount of oxidized proteins in stationary-phase cells. Heather worked in a pediatric office before applying to medical school.
{{break{&nbsp;}}}
[1<I[Eugenia Rakhno|pimages/rakhno.png]]
''Eugenia Rakhno'' ('08) did pilot studies to improve HPLC-based methods of quantitating isoAsp formation and PCM activity. She is now a graduate student in medical physics at Vanderbilt University.
{{break{&nbsp;}}}
[1<I[Amber Cibrario with Adam Bussell|pimages/cibrario.png]]
''Amber Cibrario'' ('09) was a Merck/AAAS[L[http://php.aaas.org/programs/education/merck/]] fellow, working at the overlap of biology and chemistry to develop an HPLC-based protocol for quantitating PCM activity and isoAsp damage. Amber was our outstanding Biochemistry major in 2009 and is now in medical school at Michigan State University.
{{break{&nbsp;}}}
!!Co-transduction frequency
Co-transduction frequency is related to physical distance by the [[Wu formula|http://www.genetics.org/cgi/reprint/54/2/405]]:
>d = L (1 - ^^3^^&radic;C)
where
>d = distance between two markers (in minutes or kb)
>L = length of the transducing fragment (2 min or 90 kb for P1)
>C = cotransduction frequency (as a decimal - e.g., 10% cotransduction = 0.1)
Or, given distance:
>C = (1-^^d^^&frasl;~~L~~)^^3^^
To correct for the effect of insertions in one or both of the co-transduced genes, one can use this formula (from [[Sanderson and Roth|http://mmbr.asm.org/cgi/reprint/52/4/485.pdf]]:
>1/C = 1 + [(L-a)^^3^^&ndash;(L-a-d)^^3^^/(L-a-b-d)^^3^^]
where
>a = length of insertion in selected marker
>b = length of insertion in unselected marker
A good [[reference|http://www.sci.sdsu.edu/~smaloy/MicrobialGenetics/topics/phage/Wu.html]] (though they have the cotransduction formula slightly wrong)
!!Calculation of number of clones for a genomic library
The number of clones needed to have a certain probability (eg 95%) of including any particular sequence in a random human genomic library is:

ln (1 - P)
-------------
ln (1-1/n)

P = probability
n = length of genome / length of average cloned fragment
|rectab|k
|!component |!volume|
|vector DNA| |
|insert DNA| |
|5&times; ligase buffer*| |
|T~~4~~ DNA ligase| |
|sterile dH~~2~~O| <<ligcalc>>|
|!total volume|!10 &mu;l|
{{fine{*For 10&times; buffer, use half the indicated volume and make up the difference with dH~~2~~O.}}}
<html><input type=button class="uplig" value="calc"
onClick="var tid=story.findContainingTiddler(this).getAttribute('tiddler');story.saveTiddler(tid,tid);"></html>
!!Instructions
*Calculate or estimate the concentration of vector and insert DNA from a gel by comparison to a standard of known concentration. For example, if the standard is 5 &mu;l of 50 ng/&mu;l [[1-kb ladder|1-kb ladder]], then the 1,636-bp band contains 25 ng of DNA.
*Purify the insert and vector DNA from a gel or (only if there are no undesired fragments) from solution using [[Geneclean|Geneclean]].
*Use the form above to calculate the desired amounts of vector and insert DNA. If the DNA is less concentrated and the required volume would exceed 10 &mu;l, reduce the volume of both DNAs proportionately.
*Mix the vector and insert DNAs and water in a 0.5-ml thin-wall tube.
*Heat to 42&deg;C for 5 min. to separate sticky ends on any molecules that may have recircularized.
*Chill 1 min. on ice before adding buffer and ligase. Mix well and centrifuge briefly.
*Incubate overnight at 16&deg;C in a thermal cycler.
#[[Hicks et al. (2005)|Hicks2005]]. Recovery from long-term stationary phase and stress survival in Escherichia coli require the L-isoaspartyl protein carboxyl methyltransferase at alkaline pH. Microbiology (Reading, Engl.) 151:2151-2158.
#[[Visick and Clarke (1995)|Visick1995]]. Repair, refold, recycle: how bacteria can deal with spontaneous and environmental damage to proteins. Mol. Microbiol. 16:835-845.
/***
|Name|ListboxPlugin|
|Source|http://www.TiddlyTools.com/#ListboxPlugin|
|Documentation|http://www.TiddlyTools.com/#ListboxPluginInfo|
|Version|1.4.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|set custom field or tiddler tags by selecting from listbox/droplist|
The {{{<<select>>}}} macro allows you to set tiddler field values by selecting pre-configured values from a listbox/droplist control.  
!!!!!Documentation
>see [[ListboxPluginInfo]]
!!!!!Revisions
<<<
2010.03.14 1.4.1 use filterTiddlers() instead of getTaggedTiddlers() - use MatchTagsPlugin for tag expressions
|please see [[ListboxPluginInfo]] for additional revision details|
2007.05.12 0.5.0 started
<<<
!!!!!Code
***/
//{{{
version.extensions.ListboxPlugin= {major: 1, minor: 4, revision: 1, date: new Date(2010,3,14)};

config.macros.select = {
	tooltip: "select a value for %0@%1",
	blankTooltip: "set %0@%1=[no value]",
	valueTooltip: "set %0@%1=%2",
	otherLabel: "other",
	otherTooltip: "set %0@%1=[enter a value...]",
	otherPrompt: "enter a value for '%0'",
	editLabel: "edit list...",
	editTooltip: "edit '%0' list definition (%1)",
	changeMsg: "setting %0@%1=%2",
	verbose: false,
	hereKeyword: "here",
	defaultTarget: "SiteFields",
	handler:
	function(place,macroName,params,wikifier,paramString,tiddler) {

		// default to containing tiddler or "SiteFields" catch-all
		var here=story.findContainingTiddler(place);
		var targetID=here?here.getAttribute("tiddler"):this.defaultTarget;

		// get field name and non-default target (if any)
		var field=params.shift();
		var pos=field.indexOf("@"); // if non-default target ("field@tiddler" syntax)
		if(pos!=-1) { // split field into field and tiddlername.
			if (field.substr(pos+1)!=this.hereKeyword) // "here" == use default target
				targetID=field.substr(pos+1); // use different target tiddler
			field=field.substr(0,pos);
		}
		if(!field || !field.length) return; // no field name... do nothing
		if (field.substr(0,1)=="=") targetID="(system)"; // internal option value

		var items=[]; var listsrc='';
		var autosave=false; var allowBlank=false; var allowOther=false; var allowEdit=false;
		var allowMultiple=false; var wikifyData=false; var rows=0; var width='';
		var p=params.shift();
		while (p) {
			if (p.toLowerCase()=='autosave')	// autosave on change
				autosave=true;
			else if (p.toLowerCase()=='allowblank')	// add empty item
				var allowBlank=true;
			else if (p.toLowerCase()=='allowother')	// add "other: ____" item
				var allowOther=true;
			else if (p.toLowerCase()=='allowedit')	// add "edit list..." item
				var allowEdit=true;
			else if (p.toLowerCase()=='allowmultiple') // multi-select
				var allowMultiple=true;
			else if (p.startsWith('rows:')) // 0=autosize listbox, 1=droplist, n=listbox
				var rows=p.substr(5);
			else if (p.startsWith('width:')) // CSS width of list
				var width=p.substr(6);
			else if (p.startsWith('prompt:')) // prompt text (1st item in list)
				var ptext=p.substr(7);
			else if (p.substr(0,1)=="+"||p.substr(0,1)=="*") { // read HR-separated tiddler
				var listsrc=p.substr(1);
				var listtxt=store.getTiddlerText(listsrc,'');
				var wikifyData=p.substr(0,1)=="*";
				if (listtxt.length && wikifyData) // wikify source to handle macros/scripts
					listtxt=this.getWikifiedData(listtxt);
				if (listtxt.length)
					items=items.concat(listtxt.split(listtxt.indexOf('\n----\n')!=-1?'\n----\n':'\n'));
			}
			else if (p.startsWith("=")) { // get items from tagged tiddlers
				var filter=p.substr(1);
				if (!filter.startsWith('[')) filter='[tag['+filter+']]';
				var tids=store.filterTiddlers(filter);
				for (var t=0; t<tids.length; t++) items.push(tids[t].title);
			}
			else { // param is item value or 'label=value'
				var parts=p.split("=");
				var label=parts[0]; var v=parts[1]?parts[1]:parts[0];
				items.push(label+"="+v);
			}
			p=params.shift();
		}
		if (rows==1) allowMultiple=false; // droplist cannot do multi-select
		if (tiddler && !story.isDirty(tiddler.title)) autosave=true; // tiddler is in VIEW mode, force autosave

		this.render(createTiddlyElement(place,"span"), null,
			targetID, field, ptext, items, listsrc, wikifyData,
			rows, width, autosave, allowBlank, allowOther, allowEdit, allowMultiple);

		store.addNotification(null,this.refresh); // syncs lists when tiddlers are changed
	},
	getWikifiedData: // wikify tiddler content, then extract text WITH newlines and HRs included
	function(txt) {
		var e=createTiddlyElement(document.body,"div"); wikify(txt,e);
		var breaks=e.getElementsByTagName("br");
		for (var b=0; b<breaks.length; b++) breaks[b].parentNode.insertBefore(document.createTextNode("\n"),breaks[b]);
		var lines=e.getElementsByTagName("hr");
		for (var l=0; l<lines.length; l++) lines[l].parentNode.insertBefore(document.createTextNode("----\n"),lines[l]);
		var items=e.getElementsByTagName("li");
		for (var i=0; i<items.length; i++) items[i].parentNode.insertBefore(document.createTextNode("\n"),items[i]);
		var txt=getPlainText(e); removeNode(e); return txt;
	},
	refresh:
	function (title) { // re-render dependent lists
		var lists=document.getElementsByTagName('select');
		for (var i=0; i<lists.length; i++) { var list=lists[i];
			if (list.getAttribute('listsrc')!=title) continue; // no sync needed
			var listtxt=store.getTiddlerText(list.getAttribute('listsrc')||'','');
			if (listtxt.length && list.getAttribute("wikifyData")=="true")
				listtxt=this.getWikifiedData(listtxt);
			if (listtxt.length)
				var items=listtxt.split(listtxt.indexOf('\n----\n')!=-1?'\n----\n':'\n');
			config.macros.select.render(list.parentNode, list,
				list.getAttribute('tiddler'),
				list.getAttribute('edit'),
				list.getAttribute('ptext'),
				items||[],
				list.getAttribute('listsrc'),
				list.getAttribute("wikifyData")=="true",
				list.getAttribute("rows"),
				list.getAttribute("width"),
				list.getAttribute("autosave")=="true",
				list.getAttribute("allowBlank")=="true",
				list.getAttribute("allowOther")=="true",
				list.getAttribute("allowEdit")=="true",
				list.getAttribute("allowMultiple")=="true");
		}
	},
	render:
	function (place, here, targetID, field, ptext, items, listsrc, wikifyData,
		rows, width, autosave, allowBlank, allowOther, allowEdit, allowMultiple) {

		var values=[]; var opts=[];

		// use current selection(s) (if any) (except for "edit list..." item)
		if (here) for (var i=0; i<here.options.length; i++) {
			var opt=here.options[i];
			if (opt.selected && opt.text!=config.macros.select.editLabel) values.push(opt.value);
		}
		// no listbox or no selections... get value(s) from field (if any)
		if (!values.length) {
			var v=(field.substr(0,1)=='=')?config.options[field.substr(1)]:store.getValue(targetID,field);
			if (v) values=(field=='tags'||allowMultiple)?v.readBracketedList():[v];
		}
		// add prompt item
		if (ptext&&ptext.length)
			opts.push('<option value="_ptext" title="">'+ptext+'</option>');
		// add 'no value' item
		if ((!allowMultiple && !values.length) || allowBlank)
			opts.push('<option value="" title="'+this.blankTooltip.format([field,targetID])+'"></option>');
		// add enumerated items
		var isOther=values.length; // assume no matching value
		for (var opt=0; opt<items.length; opt++) {
			var lines=items[opt].split("\n"); var parts=lines[0].split("=");
			var label=parts[0];
			var v=parts[1]?parts[1]:parts[0];
			var title=lines[1]?lines[1]:this.valueTooltip.format([field,targetID,v]);
			var sel=values.contains(v); if (sel) isOther=false; // found matching value
			opts.push('<option value="'+v+'" '+(sel?'selected':'')+' title="'+title+'">'+label+'</option>');
		}
		// add 'other...'
		if (field=='tags') isOther=false;
		if (isOther||allowOther) {
			var label="other"+(isOther?(": "+values[0]):"...");
			var v=isOther?values[0]:'';
			var t=this.otherTooltip.format([field,targetID]);
			opts.push('<option value="'+v+'" '+(isOther?'selected':'')+' title="'+t+'">'+label+'</option>');
		}
		// add 'edit list...'
		if (listsrc && (!store.getTiddlerText(listsrc) || allowEdit)) {
			var title=this.editTooltip.format([field,listsrc]);
			opts.push('<option value="'+listsrc+'" title="'+title+'">'+this.editLabel+'</option>');
		}
		// render listbox
		var html='<select '+(values[0]?'value="'+values[0]+'" ':' ')
			+' title="'+this.tooltip.format([field,targetID])+'"'
			+' rows="'+rows+'"'+' size="'+(rows!=0?rows:opts.length)+'"'+' style="width:'+width+'"'
			+' tiddler="'+targetID+'"'+' edit="'+field+'"'+' ptext="'+ptext+'"'
			+' listsrc="'+listsrc+'"'+' wikifyData="'+wikifyData+'"'
			+' autosave="'+autosave+'"'+' allowBlank="'+allowBlank+'"'+' allowOther="'+allowOther+'"'
			+' allowEdit="'+allowEdit+'"'+' allowMultiple="'+allowMultiple+'"'+(allowMultiple?' multiple':'')
			+' onclick="return config.macros.select.onClick(this,event)"'
			+' onchange="return config.macros.select.onChange(this,event)"'
			+' ondblclick="return false">'+opts.join('')+'</select>';
		place.innerHTML=html;
	},
	onClick:
	function(here,event) {
		var sel=here.selectedIndex;
		if (sel!=-1 && here.options[sel].text.startsWith(config.macros.select.otherLabel))
			here.onchange.apply(here,arguments);
	},
	onChange:
	function(here,event) {
		var cms=config.macros.select; // abbrev
		var sel=here.selectedIndex;
		if (sel!=-1) {
			if (here.options[sel].text==cms.editLabel) {
				story.displayTiddler(story.findContainingTiddler(here),here.value,DEFAULT_EDIT_TEMPLATE);
				return false;
			}
			if (here.options[sel].text.startsWith(cms.otherLabel)) {
				var newval=prompt(cms.otherPrompt.format([here.getAttribute("edit")]),here.value);
				if (!newval) {// user cancelled
					var v=store.getValue(here.getAttribute("tiddler"),here.getAttribute("edit"));
					{ here.value=v; if (v==undefined) here.selectedIndex=0; return false; }
				};
				here.options[sel].value=newval;
				here.options[sel].text=cms.otherLabel+": "+newval;
				here.value=newval;
			}
			if (here.options[sel].value=='_ptext')
				for (var i=0; i<here.options.length; i++)
					here.options[i].selected=false;
		}
		if (here.getAttribute("autosave")=="true") config.macros.select.setFieldValue(here);
		return false;
	},
	setFieldValue: function(here) {
		var tid=here.getAttribute("tiddler"); if (!tid || !tid.length) return; // no target, do nothing
		var field=here.getAttribute("edit");
		if (field.substr(0,1)=='=') { // option cookie instead of tiddler field
			config.macros.option.propagateOption(field.substr(1),"value",here.value,"input");
			return;
		}
		// ensure tiddler exists
		if (!store.tiddlerExists(tid)) store.saveTiddler(tid,tid,"",config.options.txtUserName,new Date(),[]);
		if (field=='tags') {
			store.suspendNotifications();
			for (var i=0; i<here.options.length; i++) {
				var opt=here.options[i];
				if (opt.text==config.macros.select.editLabel) continue;
				store.setTiddlerTag(tid,opt.selected,opt.value);
			}
			store.resumeNotifications();
		} else {
			// get multi-select items
			var values=[];
			for (var i=0; i<here.options.length; i++) {
				var opt=here.options[i];
				if (opt.text==config.macros.select.editLabel) continue;
				if (opt.selected) values.pushUnique(String.encodeTiddlyLink(opt.value));
			}
			if (values.length==1) values=[here.value]; // remove unneeded brackets around single value
			store.setValue(tid,field,values.length?values.join(' '):null); // if no selections, delete field
		}
		// 'touch' tiddler and report to user
		var t=store.getTiddler(tid);
		var who=config.options.chkForceMinorUpdate?t.modifier:config.options.txtUserName;
		var when=config.options.chkForceMinorUpdate?t.modified:new Date();
		store.saveTiddler(tid,tid,t.body,who,when,t.tags,t.fields);
		if (config.macros.select.verbose)
			{ clearMessage(); displayMessage(config.macros.select.changeMsg.format([field,tid,here.value])); }
	}
}
//}}}
<script>
var slices = findAllSlices(tiddler.title);
for ( var i in slices ) {
  var pars = slices[i].split(",");
  var label = i.replace(/\_/," ");
  var text = "<script label=\"" + label + "\">\n";
  text += "listArray = makeList(\""+pars[0]+"\",\""+pars[1]+"\");\n";
  text += "showListResults(\""+label+"\",listArray)\n";
  text += "<\/script>";
  wikify(text,place);
  }
</script>
/%
|Reading_list|tags,reading|
|Ordered|tags,ordered|
|To_order|tags,order|
%/
|datatable|k
| Ingredient | Final<br>Conc. | Amount to make 100 ml |h
|Na~~2~~HPO~~4~~, 1 M pH 12| 73 mM| 7.3 ml|
|CuSO~~4~~&bull;5H~~2~~O| 0.40 mM| 10 mg|
|Na-K tartarate&bull; 4H~~2~~O| 0.886 mM| 25 mg|
|SDS, 10%| 1%|10 ml|
|Acetonitrile| 5%| 5 ml|
*Dissolve CuSO~~4~~ and tartarate in about 50 ml dH~~2~~O
*Add phosphate buffer and acetonitrile
*Bring to volume of 90 ml, then add SDS and mix
*Avoid vigorous mixing after addition of SDS (foams)
{{proctxt{
!!How it works```See [[comparison|http://pierce-endogen.com/Proteomics/browse.cfm?fldID=BE219700-9B95-43A1-A3DA-83800F1A0392]] of different protein assays and more info from Pierce```
Cupric sulfate and tartrate are reacted with proteins from lysed cells in an alkaline solution, forming copper-protein complexes. These copper complexes reduce a yellow reagent, the Folin-Ciocalteu Reagent, producing a blue color that can be measured using a spectrophotometer at 750 nm. The more protein, the more complexed copper and thus the more reduction of the reagent and the more blue color. A standard curve using protein solutions of known concentration is required in order to actually quantitate the protein present in the extract. [G[BSA|BSA]] is commonly used for the standard curve.

!!Materials
{{proctab{
|[[TCA|TCA (10%)]]|10%|1 ml/sample|
|[[Lowry Reagent A]]||1 ml/sample|
|[[Lowry Reagent B]]||20 &mu;l/sample|
|Folin-Ciocalteu reagent||50 &mu;l/sample|
|[[BSA standard|BSA protein standard]]|1 mg/ml|1.2 ml/assay|
}}}
!!Procedure###Lowry1951###
*Set up standard curve by pipetting 0, 10, 20, 30, 40 and 50 &mu;l of 1 mg/ml BSA standard```Exact concentration of [[BSA standard|BSA protein standard]] should be determined spectrophotometrically.``` (0-50 &mu;g protein```Above 50 &mu;g, the curve may not be linear```) into microcentrifuge tubes in duplicate.
*Transfer desired amount```For E. coli crude extracts, 5-10 &mu;l of an extract made in 1/10 of the original culture volume will typically yield 20-50 &mu;g of protein for an overnight culture; try 15-30 &mu;l for an extract from an exponentially growing culture.``` of unknown samples```See chart of chemicals [[compatible|docs/lowry compatibility.pdf]] with the Lowry assay (TCA precipitation step resolves many compatibility problems, however)``` into microcentrifuge tubes in duplicate.
*Add 1 ml of 10% TCA to each standard and each sample. Let stand 10 min.
>>[G[TCA|TCA]] precipitates proteins, so this will allow most other molecules that might potentially interfere with the assay to be removed with the supernatant.
*Microcentrifuge 10 min. at full speed and remove supernatant by aspiration
*Make Lowry reagent C```''@@color: red;Lowry reagent C must be made fresh daily@@''``` by mixing 1 part Lowry reagent B with 50 parts Lowry reagent A
*Add 1 ml of Lowry reagent C to each pellet and let stand 10 min.
*Dilute folin reagent 1:1 with dH~~2~~O```''@@color: red;Folin reagent must be freshly diluted just before use@@''``` and add 100 &mu;l to each sample, vortexing each tube immediately
*Read absorbance at 750 nm for each sample. Standards and samples should all be read within a 5-minute period, as color will continue to darken slowly.
*If unknowns are not in range of standards, change amounts of unknowns used and repeat.
!!Analysis
*Construct standard curve of absorbance vs. amount of BSA (in µg)
*Use equation of best-fit straight line to calculate amount of protein in each unknown sample tube
*Work backward to calculate the concentration of protein in each original sample.
}}}
{{menuTitle{Protocols}}}
{{menuText{
<<forEachTiddler
  where 'tiddler.tags.contains("protocol")'
  write '"*[["+truncate(tiddler.title,18)+"|"+tiddler.title+"]]\n"'
  >>
[[Protocol index|ProtocolIndex]]
}}}
<<tiddler PubMenuStore>>
----
*[[Projects]]
*[[Glossary]]

[[edit|MainMenuStore]]


<!--{{{-->
<link rel="shortcut icon" href="wimages/favicon.ico" type="image/x-icon">
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
<<tabs indexTabs
Protocols Protocols MenuIndex##protocols
>>

/%
!protocols
<<forEachTiddler
where 'tiddler.tags.contains("protocol")'
sortBy 'tiddler.title'
write '"[[" + truncate(tiddler.title,15) + "|" + tiddler.title + "]]"'
begin '"{{menuIndex{\n"'
end '"}}}"'
>>
!end
%/
!!Rationale
An increasing body of indirect evidence supports connections between PCM-mediated protein repair and protein folding (see [[Results]]). So far, however, studies that have directly examined protein folding have been limited to //in vitro// folding assays (e.g., of ribonuclease A###DiDonato1993###), crystallographic studies###Capasso1996### or effects on foreign proteins expressed in //E. coli//###Kern2005,Wang2006,Zhu2006###. Taking advantage of the availability of genomic and proteomic information as well as an //in vivo// folding reporter, we propose a novel experimental approach which will allow us to begin accumulating information about the folding of natural substrates for PCM-mediated repair //in vivo//.
!!Experimental design
We propose to monitor folding by fusing the small [g[&alpha;-fragment|a_fragment]] of [g[&beta;-galactosidase|b_galactosidase]] to the C-terminus of a target protein. In an //E. coli// strain expressing the &omega;-fragment of the protein, the two peptides can interact ("[g[structural complementation|structural_complementation]]"), producing active &beta;-galactosidase, so long as the target protein is properly folded and soluble (see figure below). If the target protein becomes unfolded or misfolded, it will begin to aggregate, and its solubility and thus the level of &beta;-galactosidase activity will be reduced###Stidham2003###. This system has been used successfully to investigate the conformational stability of a variety of proteins in //E. coli//###Wigley2001###.
[0i[Structural complementation to produce active &beta;-galactosidase|wimages/bgal.png]]

For our purposes, the &alpha-fragment fusion has three key advantages: (i) there are straightforward [g[&beta;-galactosidase assays|b_gal_assay]] to detect activity of the enzyme either qualitatively or quantitatively; (ii) the fusion peptide is relatively small (54 amino acids) and thus unlikely to grossly alter protein folding; and (iii) unlike a [g[GFP]] or [g[CAT]] reporter, it is sensitive not only to early folding events but also to post-translational aggregation###Stidham2003###. That is, if a fusion protein is initially properly folded, the &alpha- and &omega-fragments will interact to give &beta-galactosidase activity, but if the target protein later unfolds and aggregates, activity will be reduced. This post-translational aggregation of the target protein is exactly the phenomenon we expect to observe if proteins in aging cells unfold over time due to the consequences of unrepaired isoAsp damage.
!!Candidate proteins for the folding assay
We would like to target a limited number of good candidates for PCM-mediated effects on folding. To identify likely substrates for PCM-mediated repair, we used a [g[bioinformatic|bioinformatics]] approach: we developed a [g[PERL|perl]] program to [g[mine|data_mining]] the //E. coli// genome, using the GenBank###Benson2007### database, in order to discover proteins with a high percentage of Asp and Asn residues. We hypothesized that these would be among the proteins most likely to sustain isoAsp damage.

The mean value for combined Asp and Asn residues in the //E. coli// proteome is 8.9 per 100 total residues, or a fractional value of 0.089. Of the 4243 predicted protein sequences in the //E. coli// genome, the Asp/Asn content falls within one standard deviation of this mean value for 2957 protein sequences. The Asp/Asn content exceeds the mean by more than one standard deviation for 586 proteins, and only 105 proteins have Asp/Asn exceeding the mean by more than two standard deviations.

{{floatablel{<<tiddler Table1>>}}}{{floatabler{<<tiddler Table2>>}}}
Starting with these 105 "high Asp/Asn" sequences, we refined the list for further consideration by excluding: (i) [g[pseudogenes|pseudogene]]; (ii) proteins with less than 100 amino acids (too small to have significant folded structure); and (iii) known and predicted inner- and outer-membrane proteins and periplasmic proteins (assuming that PCM functions in the cytoplasm). This left 13 proteins with known or hypothesized functions (Table 1) and 35 uncharacterized proteins (Table 2).

Interestingly, two of the proteins with putative functions (YibA and Imp) and four of the uncharacterized proteins (YddK, YjbL, YjbM and YoaB) have essential functions in //E. coli//###Gerdes2003###. We propose to initially examine the effect of PCM on folding of the top five proteins in each of these categories. We will also test ribosomal protein S11, the sole specific //E. coli// protein identified to date as an //in vivo// substrate for PCM###David1999###.

{{floatabler{<<tiddler Table3>>}}}We also took advantage of available proteomic data for chaperone substrates and other conformationally unstable proteins. One such study###Mogk1999### has described 57 proteins that aggregate readily at elevated temperatures in the absence of disaggregating chaperons. We propose to examine folding of the seven of these that have an Asp/Asn content more than one standard deviation above the mean (Table 3). None exceed the mean by more than two standard deviations. Among these proteins, GapA is essential for //E. coli// growth###Gerdes2003###.{{break{&nbsp;}}}
!!Construction of folding reporters
[1>i[Recombination of a gene of interest into the chromosome at the //attB// site.|wimages/rec.png]]Chromosomal integration of reporter constructs will be needed to ensure stable maintenance during long-term stationary phase. We will construct a [g[vector]] that can be used to integrate any desired sequence at a site on the //E. coli// chromosome where the transposon Tn7 normally inserts (see figure at right). We will then add the coding sequence for the &beta;-galactosidase &alpha;-fragment (residues 6-59 of the //E. coli// //lacZ// gene) with an appropriately positioned start codon and Shine-Dalgarno sequence as well as a constitutive or arabinose-inducible promoter. Any target gene can then be PCR-amplified with appropriate primers and cloned into the vector to generate an in-frame C-terminal fusion to the &alpha;-fragment (see figure below). The gene fusion will then be integrated into the chromosome of wild-type and &Delta;//pcm// strains (see [[protocol|Chromosomal Integration with pKAS46]]).
[0i[Construction of fusions of the //lacZ// &alpha;-fragment to genes of interest.|wimages/bgalvec.png]]

Wild-type and PCM-deficient strains carrying a particular reporter construct will be grown to stationary phase in LB broth containing arabinose to induce expression of the reporter fusion. After 24 hours of growth, cells will be pelleted, washed and resuspended in buffered saline or in [g['conditioned medium'|conditioned_medium]] in which cells had been grown without arabinose. This treatment will minimize further expression (the //araBAD// promoter allows little expression in the absence of arabinose###Guzman1995###), so that we can monitor folding of the existing fusion proteins, but will not support resumption of growth. Cultures will be grown under aging and stress conditions, removing aliquots daily during aging and at 30-minute intervals during recovery to measure &beta;-galactosidase activity using a microplate assay###Griffith2002### (see [[Microplate Assay for B-galactosidase]]) based on the standard spectrophotometric method (see [[B-Galactosidase Assay]]). Culture aliquots will also be heated to look for differences in heat-inducible unfolding.

See the [[experimental outline|Monitoring Folding: Project Outline]] for specific suggestions on how to get this project started.
/***
|Name|NestedSlidersPlugin|
|Source|http://www.TiddlyTools.com/#NestedSlidersPlugin|
|Documentation|http://www.TiddlyTools.com/#NestedSlidersPluginInfo|
|Version|2.4.9|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|show content in nest-able sliding/floating panels, without creating separate tiddlers for each panel's content|
!!!!!Documentation
>see [[NestedSlidersPluginInfo]]
!!!!!Configuration
<<<
<<option chkFloatingSlidersAnimate>> allow floating sliders to animate when opening/closing
>Note: This setting can cause 'clipping' problems in some versions of InternetExplorer.
>In addition, for floating slider animation to occur you must also allow animation in general (see [[AdvancedOptions]]).
<<<
!!!!!Revisions
<<<
2008.11.15 - 2.4.9 in adjustNestedSlider(), don't make adjustments if panel is marked as 'undocked' (CSS class).  In onClickNestedSlider(), SHIFT-CLICK docks panel (see [[MoveablePanelPlugin]])
|please see [[NestedSlidersPluginInfo]] for additional revision details|
2005.11.03 - 1.0.0 initial public release.  Thanks to RodneyGomes, GeoffSlocock, and PaulPetterson for suggestions and experiments.
<<<
!!!!!Code
***/
//{{{
version.extensions.NestedSlidersPlugin= {major: 2, minor: 4, revision: 9, date: new Date(2008,11,15)};

// options for deferred rendering of sliders that are not initially displayed
if (config.options.chkFloatingSlidersAnimate===undefined)
	config.options.chkFloatingSlidersAnimate=false; // avoid clipping problems in IE

// default styles for 'floating' class
setStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \
	background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");

// if removeCookie() function is not defined by TW core, define it here.
if (window.removeCookie===undefined) {
	window.removeCookie=function(name) {
		document.cookie = name+'=; expires=Thu, 01-Jan-1970 00:00:01 UTC; path=/;'; 
	}
}

config.formatters.push( {
	name: "nestedSliders",
	match: "\\n?\\+{3}",
	terminator: "\\s*\\={3}\\n?",
	lookahead: "\\n?\\+{3}(\\+)?(\\([^\\)]*\\))?(\\!*)?(\\^(?:[^\\^\\*\\@\\[\\>]*\\^)?)?(\\*)?(\\@)?(?:\\{\\{([\\w]+[\\s\\w]*)\\{)?(\\[[^\\]]*\\])?(\\[[^\\]]*\\])?(?:\\}{3})?(\\#[^:]*\\:)?(\\>)?(\\.\\.\\.)?\\s*",
	handler: function(w)
		{
			lookaheadRegExp = new RegExp(this.lookahead,"mg");
			lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = lookaheadRegExp.exec(w.source)
			if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
			{
				var defopen=lookaheadMatch[1];
				var cookiename=lookaheadMatch[2];
				var header=lookaheadMatch[3];
				var panelwidth=lookaheadMatch[4];
				var transient=lookaheadMatch[5];
				var hover=lookaheadMatch[6];
				var buttonClass=lookaheadMatch[7];
				var label=lookaheadMatch[8];
				var openlabel=lookaheadMatch[9];
				var panelID=lookaheadMatch[10];
				var blockquote=lookaheadMatch[11];
				var deferred=lookaheadMatch[12];

				// location for rendering button and panel
				var place=w.output;

				// default to closed, no cookie, no accesskey, no alternate text/tip
				var show="none"; var cookie=""; var key="";
				var closedtext=">"; var closedtip="";
				var openedtext="<"; var openedtip="";

				// extra "+", default to open
				if (defopen) show="block";

				// cookie, use saved open/closed state
				if (cookiename) {
					cookie=cookiename.trim().slice(1,-1);
					cookie="chkSlider"+cookie;
					if (config.options[cookie]==undefined)
						{ config.options[cookie] = (show=="block") }
					show=config.options[cookie]?"block":"none";
				}

				// parse label/tooltip/accesskey: [label=X|tooltip]
				if (label) {
					var parts=label.trim().slice(1,-1).split("|");
					closedtext=parts.shift();
					if (closedtext.substr(closedtext.length-2,1)=="=")	
						{ key=closedtext.substr(closedtext.length-1,1); closedtext=closedtext.slice(0,-2); }
					openedtext=closedtext;
					if (parts.length) closedtip=openedtip=parts.join("|");
					else { closedtip="show "+closedtext; openedtip="hide "+closedtext; }
				}

				// parse alternate label/tooltip: [label|tooltip]
				if (openlabel) {
					var parts=openlabel.trim().slice(1,-1).split("|");
					openedtext=parts.shift();
					if (parts.length) openedtip=parts.join("|");
					else openedtip="hide "+openedtext;
				}

				var title=show=='block'?openedtext:closedtext;
				var tooltip=show=='block'?openedtip:closedtip;

				// create the button
				if (header) { // use "Hn" header format instead of button/link
					var lvl=(header.length>5)?5:header.length;
					var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,buttonClass,title);
					btn.onclick=onClickNestedSlider;
					btn.setAttribute("href","javascript:;");
					btn.setAttribute("title",tooltip);
				}
				else
					var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider,buttonClass);
				btn.innerHTML=title; // enables use of HTML entities in label

				// set extra button attributes
				btn.setAttribute("closedtext",closedtext);
				btn.setAttribute("closedtip",closedtip);
				btn.setAttribute("openedtext",openedtext);
				btn.setAttribute("openedtip",openedtip);
				btn.sliderCookie = cookie; // save the cookiename (if any) in the button object
				btn.defOpen=defopen!=null; // save default open/closed state (boolean)
				btn.keyparam=key; // save the access key letter ("" if none)
				if (key.length) {
					btn.setAttribute("accessKey",key); // init access key
					btn.onfocus=function(){this.setAttribute("accessKey",this.keyparam);}; // **reclaim** access key on focus
				}
				btn.setAttribute("hover",hover?"true":"false");
				btn.onmouseover=function(ev) {
					// optional 'open on hover' handling
					if (this.getAttribute("hover")=="true" && this.sliderPanel.style.display=='none') {
						document.onclick.call(document,ev); // close transients
						onClickNestedSlider(ev); // open this slider
					}
					// mouseover on button aligns floater position with button
					if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this,this.sliderPanel);
				}

				// create slider panel
				var panelClass=panelwidth?"floatingPanel":"sliderPanel";
				if (panelID) panelID=panelID.slice(1,-1); // trim off delimiters
				var panel=createTiddlyElement(place,"div",panelID,panelClass,null);
				panel.button = btn; // so the slider panel know which button it belongs to
				btn.sliderPanel=panel; // so the button knows which slider panel it belongs to
				panel.defaultPanelWidth=(panelwidth && panelwidth.length>2)?panelwidth.slice(1,-1):"";
				panel.setAttribute("transient",transient=="*"?"true":"false");
				panel.style.display = show;
				panel.style.width=panel.defaultPanelWidth;
				panel.onmouseover=function(event) // mouseover on panel aligns floater position with button
					{ if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this.button,this); }

				// render slider (or defer until shown) 
				w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
				if ((show=="block")||!deferred) {
					// render now if panel is supposed to be shown or NOT deferred rendering
					w.subWikify(blockquote?createTiddlyElement(panel,"blockquote"):panel,this.terminator);
					// align floater position with button
					if (window.adjustSliderPos) window.adjustSliderPos(place,btn,panel);
				}
				else {
					var src = w.source.substr(w.nextMatch);
					var endpos=findMatchingDelimiter(src,"+++","===");
					panel.setAttribute("raw",src.substr(0,endpos));
					panel.setAttribute("blockquote",blockquote?"true":"false");
					panel.setAttribute("rendered","false");
					w.nextMatch += endpos+3;
					if (w.source.substr(w.nextMatch,1)=="\n") w.nextMatch++;
				}
			}
		}
	}
)

function findMatchingDelimiter(src,starttext,endtext) {
	var startpos = 0;
	var endpos = src.indexOf(endtext);
	// check for nested delimiters
	while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {
		// count number of nested 'starts'
		var startcount=0;
		var temp = src.substring(startpos,endpos-1);
		var pos=temp.indexOf(starttext);
		while (pos!=-1)  { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }
		// set up to check for additional 'starts' after adjusting endpos
		startpos=endpos+endtext.length;
		// find endpos for corresponding number of matching 'ends'
		while (startcount && endpos!=-1) {
			endpos = src.indexOf(endtext,endpos+endtext.length);
			startcount--;
		}
	}
	return (endpos==-1)?src.length:endpos;
}
//}}}
//{{{
window.onClickNestedSlider=function(e)
{
	if (!e) var e = window.event;
	var theTarget = resolveTarget(e);
       while (theTarget && theTarget.sliderPanel==undefined) theTarget=theTarget.parentNode;
	if (!theTarget) return false;
	var theSlider = theTarget.sliderPanel;
	var isOpen = theSlider.style.display!="none";

	// if SHIFT-CLICK, dock panel first (see [[MoveablePanelPlugin]])
	if (e.shiftKey && config.macros.moveablePanel) config.macros.moveablePanel.dock(theSlider,e);

	// toggle label
	theTarget.innerHTML=isOpen?theTarget.getAttribute("closedText"):theTarget.getAttribute("openedText");
	// toggle tooltip
	theTarget.setAttribute("title",isOpen?theTarget.getAttribute("closedTip"):theTarget.getAttribute("openedTip"));

	// deferred rendering (if needed)
	if (theSlider.getAttribute("rendered")=="false") {
		var place=theSlider;
		if (theSlider.getAttribute("blockquote")=="true")
			place=createTiddlyElement(place,"blockquote");
		wikify(theSlider.getAttribute("raw"),place);
		theSlider.setAttribute("rendered","true");
	}

	// show/hide the slider
	if(config.options.chkAnimate && (!hasClass(theSlider,'floatingPanel') || config.options.chkFloatingSlidersAnimate))
		anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));
	else
		theSlider.style.display = isOpen ? "none" : "block";

	// reset to default width (might have been changed via plugin code)
	theSlider.style.width=theSlider.defaultPanelWidth;

	// align floater panel position with target button
	if (!isOpen && window.adjustSliderPos) window.adjustSliderPos(theSlider.parentNode,theTarget,theSlider);

	// if showing panel, set focus to first 'focus-able' element in panel
	if (theSlider.style.display!="none") {
		var ctrls=theSlider.getElementsByTagName("*");
		for (var c=0; c<ctrls.length; c++) {
			var t=ctrls[c].tagName.toLowerCase();
			if ((t=="input" && ctrls[c].type!="hidden") || t=="textarea" || t=="select")
				{ try{ ctrls[c].focus(); } catch(err){;} break; }
		}
	}
	var cookie=theTarget.sliderCookie;
	if (cookie && cookie.length) {
		config.options[cookie]=!isOpen;
		if (config.options[cookie]!=theTarget.defOpen) window.saveOptionCookie(cookie);
		else window.removeCookie(cookie); // remove cookie if slider is in default display state
	}

	// prevent SHIFT-CLICK from being processed by browser (opens blank window... yuck!)
	// prevent clicks *within* a slider button from being processed by browser
	// but allow plain click to bubble up to page background (to close transients, if any)
	if (e.shiftKey || theTarget!=resolveTarget(e))
		{ e.cancelBubble=true; if (e.stopPropagation) e.stopPropagation(); }
	Popup.remove(); // close open popup (if any)
	return false;
}
//}}}
//{{{
// click in document background closes transient panels 
document.nestedSliders_savedOnClick=document.onclick;
document.onclick=function(ev) { if (!ev) var ev=window.event; var target=resolveTarget(ev);

	if (document.nestedSliders_savedOnClick)
		var retval=document.nestedSliders_savedOnClick.apply(this,arguments);
	// if click was inside a popup... leave transient panels alone
	var p=target; while (p) if (hasClass(p,"popup")) break; else p=p.parentNode;
	if (p) return retval;
	// if click was inside transient panel (or something contained by a transient panel), leave it alone
	var p=target; while (p) {
		if ((hasClass(p,"floatingPanel")||hasClass(p,"sliderPanel"))&&p.getAttribute("transient")=="true") break;
		p=p.parentNode;
	}
	if (p) return retval;
	// otherwise, find and close all transient panels...
	var all=document.all?document.all:document.getElementsByTagName("DIV");
	for (var i=0; i<all.length; i++) {
		 // if it is not a transient panel, or the click was on the button that opened this panel, don't close it.
		if (all[i].getAttribute("transient")!="true" || all[i].button==target) continue;
		// otherwise, if the panel is currently visible, close it by clicking it's button
		if (all[i].style.display!="none") window.onClickNestedSlider({target:all[i].button})
		if (!hasClass(all[i],"floatingPanel")&&!hasClass(all[i],"sliderPanel")) all[i].style.display="none";
	}
	return retval;
};
//}}}
//{{{
// adjust floating panel position based on button position
if (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel) {
	if (hasClass(panel,"floatingPanel") && !hasClass(panel,"undocked")) {
		// see [[MoveablePanelPlugin]] for use of 'undocked'
		var rightEdge=document.body.offsetWidth-1;
		var panelWidth=panel.offsetWidth;
		var left=0;
		var top=btn.offsetHeight; 
		if (place.style.position=="relative" && findPosX(btn)+panelWidth>rightEdge) {
			left-=findPosX(btn)+panelWidth-rightEdge; // shift panel relative to button
			if (findPosX(btn)+left<0) left=-findPosX(btn); // stay within left edge
		}
		if (place.style.position!="relative") {
			var left=findPosX(btn);
			var top=findPosY(btn)+btn.offsetHeight;
			var p=place; while (p && !hasClass(p,'floatingPanel')) p=p.parentNode;
			if (p) { left-=findPosX(p); top-=findPosY(p); }
			if (left+panelWidth>rightEdge) left=rightEdge-panelWidth;
			if (left<0) left=0;
		}
		panel.style.left=left+"px"; panel.style.top=top+"px";
	}
}
//}}}
//{{{
// TW2.1 and earlier:
// hijack Slider stop handler so overflow is visible after animation has completed
Slider.prototype.coreStop = Slider.prototype.stop;
Slider.prototype.stop = function()
	{ this.coreStop.apply(this,arguments); this.element.style.overflow = "visible"; }

// TW2.2+
// hijack Morpher stop handler so sliderPanel/floatingPanel overflow is visible after animation has completed
if (version.major+.1*version.minor+.01*version.revision>=2.2) {
	Morpher.prototype.coreStop = Morpher.prototype.stop;
	Morpher.prototype.stop = function() {
		this.coreStop.apply(this,arguments);
		var e=this.element;
		if (hasClass(e,"sliderPanel")||hasClass(e,"floatingPanel")) {
			// adjust panel overflow and position after animation
			e.style.overflow = "visible";
			if (window.adjustSliderPos) window.adjustSliderPos(e.parentNode,e.button,e);
		}
	};
}
//}}}
''Why Stress?'' Why do we see survival defects for //pcm// mutants in stationary phase only when an environmental stress is present? Not all stresses produce this effect, and so far, the ones that do (heat, oxidation, salt, methanol) can all affect ''protein folding''. Based on this observation, we hypothesize that isoaspartyl damage may destabilize a protein's three-dimensional structure, so that it is either more easily unfolded or more difficult to refold after unfolding. The model below shows how this might work; either: (i) partial unfolding due to environmental stress could allow more (or more rapid) isoAsp formation; (ii) isoAsp formation could magnify the unfolding effect of the stress; or (iii) isoAsp formation could expose additional sites for oxidation or other stress-induced damage. Alternatively, degradation and recycling of unfolded proteins could be blocked by isoAsp formation. We are currently working to test this hypothesis and to distinguish among these different models.
[0I[Models for the interaction between isoAsp formation and unfolding stresses|wimages/foldingmodels.jpg]]

''When is PCM needed?'' Two surprising results may shed light on when PCM is needed in aging //E. coli//. First, we found that isoaspartyl damage accumulates during stationary phase, but that there is no significant difference in accumulation between wild-type cells and //pcm// mutants###Visick1998a###. Although high pH speeded up isoAsp accumulation, no difference could be seen between wild-type and mutant strains.###Hicks2005### Secondly, recent experiments show that aged //pcm// mutants have an unusually long lag phase when transferred to fresh medium at pH 9.2 Taken together, these results suggest that PCM may have limited function in metabolically inactive starving cells but is needed to repair proteins and speed recovery once nutrients are restored. Enhanced stationary-phase stress survival may really be due to improved recovery of those sub-populations of cells that can grow and divide during this period. This is an active area of investigation in the lab currently.

''Where is PCM needed?'' PCM appears, based on its amino-acid sequence, to be a cytoplasmic protein. Yet, if the effect of pH is to increase the rate of isoaspartyl damage, proteins in the inner and outer membranes and periplasm of the E. coli cell would be most readily affected: the cytoplasmic pH is strongly buffered. It may be that a relatively small change in cytoplasmic pH has a significant effect, or it is possible that PCM could also assist in maintaining functional cell-surface proteins in some way. For example, one author has suggested that PCM released from lysed cells could function in the extracellular milleu###Clarke2003###. We plan to examine isoaspartyl accumulation and the role of PCM in various cellular compartments.
[>1I[The //surE//-//pcm// operon in //E. coli//|wimages/sure.gif]]''PCM and SurE''. In the genomes of //E. coli// and many other bacteria, //pcm// is the second gene in an operon with a gene designated //surE// (see figure at right). Based on its structure, the SurE protein has been classified as an acid phosphatase###Lee2001###, but its specific function is unknown. No phenotypes have yet been detected in mutants lacking the //surE// gene, except that a //surE-pcm// double mutant shows no loss of stress resistance###Visick1998a###. Interestingly, isoaspartyl damage accumulates to a higher level in a //surE-pcm// double mutant than in wild-type cells or cells with only one of the two mutations. We suspect that SurE and PCM work together in some way to mitigate the effects of isoaspartyl damage, but the role of SurE is presently unclear.

{{hbox{Want to contribute?}}}The answers to these questions will come from undergraduate research! NCC students who would like to work on protein repair by PCM in //E. coli// should [[contact Dr. Visick|mailto:jevisick@noctrl.edu]] to discuss possible projects. Research can be done during the summer (stipends are available; see the [[Biology|http://www.noctrl.edu/majors/biology]] department [[research page|http://depts.noctrl.edu/biology/research/index.htm]] for more info.), during the academic year or during D-term.
/***
General options:
[[OptionsPanel]]
***/

// // Limit saved popup display
//{{{
window.oldDisplayMessage = displayMessage;
displayMessage = function (text,linkText) {
  oldDisplayMessage(text,linkText);
  setTimeout( 'clearMessage()', 20000 );
  };
//}}}

// // Set options independent of user's browser
//{{{
config.options.chkAutoSave = true; // save automatically
config.options.chkSaveBackups = false; // don't save backup files
config.options.chkHideTabsBarWhenSingleTab = true; // keep TiddlersBar available even if only one tiddler open
config.options.txtSelectedTiddlerTabButton = "none"; // don't close other tabs when clicking selected in TiddlersBar
config.options.chkAnimate = false; // don't animate
config.macros.edit.saveMsg = ""; // suppress confirmation message for editing in view mode
config.options.chkDisableNonExistingWikiLinks= true; // disable automatic creation of links from WikiWords
config.options.chkDisableWikiLinks=true; // disable automatic creation of links from WikiWords
config.options.chkSinglePagePermalink = false; // don't automatically permalink page (SPM)
config.options.chkSinglePageKeepFoldedTiddlers = true; // don't close tiddlers that are folded (SPM)
config.options.chkSinglePageKeepEditedTiddlers = true; // don't close tiddlers that are being edited (SPM)
config.options.chkTopOfPageMode = true; // open tiddlers at the top of the page (SPM; probably not important with tiddlersBar)
//}}}

// // Customize backstage with style sheet and index
//{{{
config.tasks.styleSheet = {
        text: "styles",
        tooltip: "Open style sheet",
        action: function() {story.displayTiddler("top","StyleSheet");}
 };

config.tasks.topTabs = {
        text: "index",
        tooltip: "Index of tiddlers",
        content: "<<tiddler CustomTabs>>"
};

config.backstageTasks.push("topTabs");
config.backstageTasks.push("styleSheet");
//}}}

// // Core Tweak #683 - workaround for Firefox "security enhancement" affecting Import/Browse function
// //     Requires Core Tweak #604
//{{{
if (window.Components) {
	var fixhtml='<input name="txtBrowse" style="width:30em"><input type="button" value="..."'
		+' onClick="window.browseForFilename(this.previousSibling,true)">';
	var cmi=config.macros.importTiddlers;
	cmi.step1Html=cmi.step1Html.replace(/<input type='file' size=50 name='txtBrowse'>/,fixhtml);
}

merge(config.messages,{selectFile:'Please enter or select a file'}); // ready for I18N translation

window.browseForFilename=function(target,mustExist) { // note: both params are optional
	var msg=config.messages.selectFile;
	if (target && target.title) msg=target.title; // use target field tooltip (if any) as dialog prompt text
	// get local path for current document
	var path=getLocalPath(document.location.href);
	var p=path.lastIndexOf('/'); if (p==-1) p=path.lastIndexOf('\\'); // Unix or Windows
	if (p!=-1) path=path.substr(0,p+1); // remove filename, leave trailing slash
	var file=''
	var result=window.askForFilename(msg,path,file,mustExist); // requires #604
	if (target && result.length) // set target field and trigger handling
		{ target.value=result; target.onchange(); }
	return result; 
}
//}}}

//  // Core Tweak #604 - secure file picker that passes full pathname (used for Attach File as well as for tweak #683)
//{{{
window.askForFilename=function(msg,path,file,mustExist) {
	var r = window.mozAskForFilename(msg,path,file,mustExist);
	if(r===null || r===false)
		r = window.ieAskForFilename(msg,path,file,mustExist);
	if(r===null || r===false)
		r = window.javaAskForFilename(msg,path,file,mustExist);
	if(r===null || r===false)
		r = prompt(msg,path+file);
	return r||'';
}

window.mozAskForFilename=function(msg,path,file,mustExist) {
	if(!window.Components) return false;
	try {
		netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
		var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
		var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
		picker.init(window, msg, mustExist?nsIFilePicker.modeOpen:nsIFilePicker.modeSave);
		var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
		thispath.initWithPath(path);
		picker.displayDirectory=thispath;
		picker.defaultExtension='html';
		picker.defaultString=file;
		picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterText|nsIFilePicker.filterHTML);
		if (picker.show()!=nsIFilePicker.returnCancel)
			var result=picker.file.persistentDescriptor;
	}
	catch(ex) { displayMessage(ex.toString()); }
	return result;
}

window.ieAskForFilename=function(msg,path,file,mustExist) {
	if(!config.browser.isIE) return false;
	try {
		var s = new ActiveXObject('UserAccounts.CommonDialog');
		s.Filter='All files|*.*|Text files|*.txt|HTML files|*.htm;*.html|';
		s.FilterIndex=3; // default to HTML files;
		s.InitialDir=path;
		s.FileName=file;
		return s.showOpen()?s.FileName:'';
	}
	catch(ex) { displayMessage(ex.toString()); }
	return result;
}

window.javaAskForFilename=function(msg,path,file,mustExist) {
	if(!document.applets['TiddlySaver']) return false;
	// TBD: implement java-based askFile(...) function
	try { return document.applets['TiddlySaver'].askFile(msg,path,file,mustExist); } 
	catch(ex) { displayMessage(ex.toString()); }
}

merge(config.messages,{selectFile:'Please enter or select a file'});

window.browseForFilename=function(target,mustExist) { // note: both params are optional
	var msg=config.messages.selectFile;
	if (target && target.title) msg=target.title; // use target field tooltip (if any) as dialog prompt text
	// get local path for current document
	var path=getLocalPath(document.location.href);
	var p=path.lastIndexOf('/'); if (p==-1) p=path.lastIndexOf('\\'); // Unix or Windows
	if (p!=-1) path=path.substr(0,p+1); // remove filename, leave trailing slash
	var file=''
	var result=window.askForFilename(msg,path,file,mustExist); // requires #604
	if (target && result.length) // set target field and trigger handling
		{ target.value=result; target.onchange(); }
	return result; 
}
//}}}

// // Change window caption
//{{{
function getPageTitle() { return wikifyPlain("WindowTitle"); } 
//}}}
These InterfaceOptions for customising TiddlyWiki are saved in your browser

Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)

<<option txtUserName>>
<<option chkSaveBackups>> SaveBackups
<<option chkAutoSave>> AutoSave
<<option chkRegExpSearch>> RegExpSearch
<<option chkCaseSensitiveSearch>> CaseSensitiveSearch
<<option chkAnimate>> EnableAnimations

----
Also see [[AdvancedOptions]]
<html>
<form id="illForm" class="formPanel" method="post" action="http://library.noctrl.edu/articles/ill_articles.php" target="_blank">
Interlibrary Loan Request Form for Articles:
<div class="box">
<label for="f_name">First Name: </label><input id="f_name" type="text" name="f_name" size="15" value="Jonathan"/> &nbsp; <label for="l_name">Last Name: </label> <input id="l_name" type="text" name="l_name" size="15" value="Visick" /> <br />
<label for="ncc_id">NCC ID #: </label> <input id="ncc_id" type="text" name="ncc_id" size="14" value="0201934" /> <br />
Status:&nbsp;<input  type="radio" name="status" value="student" /> Student&nbsp;&nbsp;<input  type="radio" name="status" value="faculty" checked /> Faculty&nbsp;&nbsp;<input  type="radio" name="status" value="staff" /> Staff
<br />
<label for="phone">Phone: </label> <input id="phone" type="text" name="phone" size="12" value="630-637-5185" /> (xxx-xxx-xxx) &nbsp;&nbsp;<label for="email_address">e-mail: </label> <input id="s_email" type="text" name="s_email" size="18" value="jevisick@noctrl.edu" />
</div>
<div class="box">
<label for="a_title">Article Title: </label> <input id="a_title" type="text" name="a_title" size="35" value="" /><br />
<label for="a_author">Author(s): </label> <input id="a_author" name="a_author" type="text" size="35" value="" /><br />
<label for="p_title">Journal Title: </label><input id="p_title" type="text" name="p_title" size="35"value="" /><br />
<label for="a_date">Year: </label> <input id ="a_date" name="a_date" type="text" size="10" value="" />&nbsp;&nbsp;<label for="p_volume">Vol:</label> <input id="p_volume" type="text" name="p_volume" size="5" value="" />&nbsp;&nbsp;<label for="p_number">Issue:</label> <input id="p_number" type="text" name="p_number" size="5" value="" />&nbsp;&nbsp;<label for="a_pages">Pages: </label> <input id="a_pages" type="text" name="a_pages" size="10" value="" />
</div>
<div class="box">
Source of Citation: <textarea name="a_source" id="a_source" name="a_source" cols="20" rows="1" value=""></textarea><br />
<label for="max">Max cost:</label> $<input id="copy_amount" type="text" name="max" size="6" value="10.00" />
<label for="n_month"> Not needed after: </label><select id="n_month" name="n_month" value="">
 <option>January</option><option>February</option><option>March</option><option>April</option><option>May</option>
 <option>June</option><option>July</option><option>August</option><option>September</option>
 <option>October</option><option>November</option><option selected>December</option></select><select id="n_day" name="n_day" value="">
 <option>1</option><option>2</option><option>3</option><option>4</option><option>5</option><option>6</option>
 <option>7</option><option>8</option><option>9</option><option>10</option><option>11</option><option>12</option>
 <option>13</option><option>14</option><option>15</option><option>16</option><option>17</option><option>18</option>
 <option>19</option><option>20</option><option>21</option><option>22</option><option>23</option>
 <option>24</option><option>25</option><option>26</option><option>27</option><option>28</option>
 <option>29</option><option>30</option><option selected>31</option></select><select id="n_year" name="n_year" value="">
 <option selected="selected">2011</option><option>2012</option><option selected>2013</option></select><br />
</div>
<div class="submitButtons">
<input type="submit" class="sButton" name="submit" value="Send Request" />
<input type="submit" class="sButton" name="cancel" value="Cancel" />
</div>
</form>
</html>

{{pcmtxt{
!!!How it works
Overlap-extension PCR is used to assemble two (or more) individual PCR products into a single DNA fragment without ligation or cloning. Typically, we use this technique to construct a deletion mutation of a gene by combining DNA from one end with DNA from the other end, leaving out the middle.

[>img[images/oepcr.png]]The two segements to be assembled are first amplified in an ordinary PCR reaction (labeled "primary" PCR in the figure at right). The two "inside" primers have extra sequence added to their 5&prime; ends that is //not// complementary to the DNA to be amplified. These sequences, however, are complementary to each other, creating an "overlap" region that is the same on one end of each amplified fragment.

Now, in a "secondary" reaction, the two initial fragments are mixed in a single PCR reaction using the "outside" primers. When the DNA is denatured and then cooled to the annealing temperature, the "overlap" regions can base-pair, allowing //Taq// DNA polymerase to make a single product including both original sequences. The result is an amplified fragment containing the two regions amplified in the primary reaction, separated by the overlap "linker" region.

!!!Reagents and supplies
Primers:
|P1|forward primer for "left" segment (20-24 nt)}|
|P2|5'-TAG@@GCGGCCGC@@ACTTAGTATG-[24-nt reverse primer for upstream segment] (with //Not//I linker)|
|P3|5'-CATACTAAGT@@GCGGCCGC@@CTT-[24-nt forward for downstream segment] (with //Not//I linker)|
|P4|reverse primer for downstream segment (20-24 nt)|
Reagents:
* //Taq// DNA polymerase
* 10× buffer
* 2.5 mM dNTPs
* 25 mM MgCl~~2~~
* PCR-quality sterile dH~~2~~O

!!!Procedure

''Primary PCR'':

Set up all components on ice and pre-cool thermal cycler to 4&deg;C

|!reaction A|!reaction B|
|1 µl chromosomal DNA (GenElute, diluted 1:10 or 1:100)|1 µl chromosomal DNA|
|10 pmol primer P1|10 pmol primer P3|
|10 pmol primer P2|10 pmol primer P4|
|5 µl 10× buffer|5 µl 10× buffer|
|4 µl 2.5 mM dNTPs|4 µl 2.5 mM dNTPs|
|1.5 mM MgCl~~2~~|1.5 mM MgCl~~2~~|
|dH~~2~~O to 50 µl total volume|dH~~2~~O to 50 µl total|

|>|>|!thermal cycler program|
|95&deg;C|>|3 min|
|>|>|@@color: red;''add 2.5 u //Taq// polymerase''@@```or use TaKaRa ExTaq HS, which is inactive until heated and can be added directly to reaction mixture```|
|98&deg;C|10 sec|24 cycles|
|50&deg;C|30 sec|~|
|72&deg;C|60 sec|~|

Check 5 &mu;l on gel for appropriate products, then proceed to secondary reaction without purifying products.

''Secondary PCR:''

Set up components on ice and hot-start as above.
Be sure annealing temperature is OK for the __overlap__ (50°C for above primers)

|!reaction mixture|>|>|!thermal cycler program|
|1 µl of reaction "A" (unpurified)|95&deg;C|>|3 min|
|1 µl of reaction "B" (unpurified)|98&deg;C|10 sec|24 cycles|
|10 pmol primer P1|50&deg;C|30 sec|~|
|10 pmol primer P4|72&deg;C|150 sec|~|
|5 µl 10× buffer|>|>|>|
|2.5 u //Taq// polymerase|>|>|>|
|4 µl 2.5 mM dNTPs|>|>|>|
|1.5 mM MgCl~~2~~|>|>|>|
|dH~~2~~O to 50 µl total volume|>|>|>|

Purify full-length product using [[Geneclean]], digest and clone
}}}
!!Rationale
Oxidative stress and resultant damage to DNA and proteins are major concerns for any cell exposed to oxygen. A sudden increase in oxidized protein early in stationary phase (due in large part to synthesis of aberrant proteins) followed by a return to baseline levels as the damaged protein is degraded has been reported previously###Dukan1998###. However, little is known about oxidized protein during long-term aging in stationary phase.

[1>i[Oxidation of lysine to form carbonyl-containing allysine|wimages/oxidation.png]]We have previously observed that PCM is required for long-term survival of //E. coli// when exposed to oxidative stress###Visick1998### (see [[Results]]). Furthermore, //pcm// mutant phenotypes are observed only when the bacteria are incubated aerobically. One model to explain the connection between PCM and oxidative stress is that isoAsp damage to proteins in aging, PCM-deficient cells would allow for increased protein oxidation, perhaps due to local unfolding (see figure below). One prominent covalent change resulting from oxidation of proteins is the formation of [g[carbonyl]] groups ([g[aldehyde]] and [g[ketone]] groups) by [g[ROS]] attack on threonine, arginine, lysine (shown at right) and proline amino acids###Amici1989###. We propose to quantitate protein carbonyl content as a measure of protein oxidation in wild-type and &Delta;//pcm// cells, which should provide evidence to help distinguish among possible models for PCM function.{{clear{&nbsp;}}}
[0i[Model showing how isoAsp damage could increase oxidation of proteins|wimages/proteinox.png]]
!!Experimental design and outcomes
Carbonyl content can be measured by reaction of the carbonyl with [g[DNPH]] to form dinitrophynyl hydrazones###Shacter2000###. We will detect oxidized proteins using a spectrophotometric [[method|Quantitation of Oxidized Protein]] in which proteins in crude extracts are reacted with DNPH and hydrazone formation is detected by absorbance at 370 nm###Dalle-Donne2003###. Oxidized protein will be measured in extracts of wild-type and &Delta;//pcm// strains after aging in the presence or absence of [g[paraquat]] and also during recovery from stationary phase after the restoration of nutrients. Bovine serum albumin reduced by treatment with sodium borohydride and completely oxidized with hypochlorous acid###Winterbourn1999### will serve as a control and aid in the quantitation of carbonyl content.

We anticipate observing increased oxidative modification of existing proteins as both wild-type and mutant cultures age, based on the requirement for oxygenation of stationary-phase cultures in order to observe either //pcm// mutant phenotypes###Hicks2005,Visick1998### or the general decrease in culture viability in stationary phase###Dukan1999###. Detailed description of protein oxidation during long-term stationary phase will be a desirable outcome of this project regardless of any PCM-related findings.

If local unfolding or destabilization of protein structure due to isoAsp formation indeed provides increased substrates for [g[ROS]] attack on proteins as suggested by the figure above, then we would expect carbonylated protein content to be higher in aged &Delta;//pcm// mutants than in wild-type cells. This may be true for untreated cultures, or paraquat treatment may be necessary in order to observe a difference. Paraquat-treated wild-type cultures will provide a valuable internal control: carbonyl content should increase relative to untreated cultures irrespective of any effect of PCM. We might also find that &Delta;//pcm// mutant cultures recovering from stationary phase reduce their carbonyl content more slowly: degradation of oxidatively damaged proteins during recovery may be facilitated by PCM-dependent repair.

If differences in carbonyl content are observed for wild-type and //pcm// mutant strains, then our studies of [[PCM's partners|PCM Rescue] should help us better understand these phenomena. For example, if increased oxidation is indeed due to destabilization of protein conformation by isoAsp, then not only overexpression of antioxidant defenses but also overexpression of [g[chaperons|chaperon]] might reduce carbonylation of proteins in the &Delta;//pcm// strain.

A caveat of this approach is that fairly substantial differences in protein oxidation would be needed in order to detect a difference in overall carbonyl content. DNPH-treated oxidized proteins can also be detected using an immunological detection method in which hydrazones present in dot blots react with an anti-DNP antibody (OxyBlot kit, Millipore Corp.###Dukan1998###). This method may provide more sensitivity to detect small differences. In addition, it could potentially be used to identify specific proteins (on SDS-PAGE or two-dimensional gels) which become disproportionately oxidized in a //pcm// mutant, providing clues to key substrates for the repair enzyme. Probably neither method could detect subtle changes in oxidation or changes in oxidation of only a few key substrates, however.

For more details on how we might approach this project, see the [[project outline|Oxidation: Project Outline]]. This project also intersects with the [[aggregation|Aggregation]], [[PCM partners|PCM Partners]] and [[PCM rescue|PCM Rescue]] projects.
!!How it works
<<icap "[>img[Oxidation of lysine to form carbonyl-containing allysine|images/oxidation.png]]">>When the amino acid threonine, arginine, lysine or proline is oxidized, a [G[carbonyl|carbonyl]] group forms. The carbonyl content of proteins can therefore be used as a measure of how much protein oxidation has occurred. [G[DNPH|DNPH]] reacts with carbonyl groups in proteins and forms dinitrophenylhydrazones, which can be quantitated using a spectrophotometer or&mdash;in this case&mdash;by binding of a specific anti-DNP [G[antibody|antibody]].

In the [G[ELISA|ELISA]] assay, we lyse cells, and react the released proteins with DNPH. Because there may be variability in the efficiency of lysing cells and recovering proteins, we also use a [[Lowry protein assay]] to measure the total protein content of the extract.

<<icap "[>img[ELISA assay for carbonylated proteins|images/elisa.png]]">>We then bind the proteins to wells of a 96-well plate and add a DNP-specific antibody (Ab) which has been linked to a small molecule called [G[biotin|biotin]]. After allowing the anti-DNP antibody to bind to any dinitrophenylhydrazones present (due to carbonyl groups resulting from oxidation), we wash off excess antibody. Now wherever there are oxidized (carbonyl-containing) proteins, we have an antibody and therefore a biotin molecule. We then add [G[streptavidin|streptavidin]], which binds tightly to biotin. The streptavidin protein is in turn linked to a molecule of the enzyme  [G[horseradish peroxidase|HRP]], or HRP. HRP catalyzes a color-change reaction when given its substrate, [G[TMB|TMB]], turning the solution blue. The amount of blue color, which can be measured by a spectrophotometer (we use a microplate reader to measure absorbance in all 96 wells in a few seconds), is proportional to the number of HRP molecules, which in turn depends on how much Ab-biotin is present, which in turn depends on how much DNP there is in the protein sample.

In order to measure carbonyl content accurately, we need standards with known carbonyl concentrations. We use oxidized [G[BSA|BSA]]&mdash;BSA which has been treated with sodium hypochlorite (bleach) to oxidize as many amino acids as possible&mdash;as our standard, with reduced BSA as our negative control.

!!Materials
{{proctab{
|[[PBS]]||10 ml plus 4 l if making oxidized and reduced BSA|
|NaOH|10 mM|1 ml|
|DNPH|10 mM in 2 N HCl|3 ml if calibrating oxidized BSA samples|
|[[HCl|HCl (2N)]]|2N|5 ml|
|[[Guanidine HCl|Guanidine HCl (6M)]]|6 M|1 ml per sample to calibrate oxidized BSA|
|[[TCA|TCA (100%)]]|100%|400 &mu;l per sample to calibrate oxidized BSA|
|KH~~2~~PO~~4~~|||
|[[DNPH|DNPH]]|10 mM|200 &mu;l/sample|
|Coating buffer|0.05 M carbonate, pH 9.6|200 &mu;l per well|
|[[TBST|TBST for ELISA]]||approx. 10 ml per well|
|Anti-DNP Ab, biotin conj.|||
|Streptavidin-HRP conj.|||
|TMB substrate||100 &mu;l/well|
|H~~2~~SO~~4~~|1 M|100 &mu;l/well|
{{proctxt{
!!Procedure for Preparing Oxidized BSA###Buss1997###
*Add 10 &mu;l of bleach to 1 ml of 10 mM NaOH in a quartz or UV-transparent cuvette, mix well and read absorbance at 290 nm.
>>Use more bleach if the absorbance is very low.
*Calculate concentration of sodium hypochlorite (HOCl) in the bleach using an extinction coefficient (&epsilon;) of 350 M^^-1^^ cm^^-1^^.
>>Don't forget to account for the 1:100 dilution!
*Add enough bleach to 10 ml of 50 mg/ml BSA to give a final concentration of 5 mM HOCl. Incubate in a waterbath at 37&deg;C for 24 hours.
>>This oxidation reaction produces as many carbonyls as possible from the amino acids in the BSA protein.
*Transfer 3 ml to a dialysis cassette and dialyze overnight at 4 &deg;C against 4 l PBS. Freeze the leftover undialzyed sample for later use.
*Check protein concentration by adding 100 &mu;l of dialized solution to 900 &mu;l of PBS in a quartz or UV-transparent cuvette. Mix well, measure absorbance at 280 nm and determine protein concentration in mg/ml by dividing the absorbance by 0.67 and then multiplying by 10 to get the concentration of the undiluted solution.
*Adjust concentration to 4 mg/ml with PBS and freeze in aliquots. 
!!Procedure for Preparing Reduced BSA###Buss1997###
*Dissolve 100 mg BSA in 10 ml PBS (10 mg/ml final concentration) in a small beaker.
*''In a hood'', slowly add 0.2 g of solid sodium borohydride while stirring.
>>This reaction produces hydrogen gas (you should see foaming), so be sure to carry it out in a chemical hood.
*Stir gently until completely dissolved and then allow to incubate 30 min. more.
*Slowly add 2 M HCl to neutralize the solution (bring it to pH 7.0).
*Transfer 3 ml to a dialysis cassette and dialyze overnight at 4 &deg;C against 4 l PBS. Freeze the leftover undialzyed sample for later use.
*Check protein concentration by adding 100 &mu;l of dialized solution to 900 &mu;l of PBS in a quartz or UV-transparent cuvette. Mix well, measure absorbance at 280 nm and determine protein concentration in mg/ml by dividing the absorbance by 0.67 and then multiplying by 10 to get the concentration of the undiluted solution.
*Adjust concentration to 4 mg/ml with PBS and freeze in aliquots.
!!Procedure for Calibrating BSA Standards###Buss1997###
>This procedure will allow the determination of the carbonyl content of the oxidized BSA standard in nmols/mg protein so that an appropriate standard curve can be constructed for the ELISA assay.
*Add 40 &mu;l (2 mg) of the undialyzed oxidized BSA standard and 160 &mu;l of PBS to 1 ml of 10 mM DNPH in 2 M HCl and incubate for 45 min.
*Add 200 &mu;l (2 mg) of the undialyzed reduced BSA standard to 1 ml of 10 mM DNPH in 2 M HCl and incubate for 45 min.
*Prepare a blank containing 40 &mu;l of oxidized BSA standard, 160 &mu;l of PBS and 1 ml of 2 M HCl (no DNPH) and incubate 45 min.
*Add 400 &mu;l of 100% TCA to each sample and mix well.
>>This step precipitates the protein
*Centrifuge for 10 minutes at full speed in the microcentrifuge.
*Remove supernatant and add 500 &mu;l of 1:1 ethanol/ethyl acetate. Vortex vigorously, then sonicate 5 pulses.
*Centrifuge for 10 minutes, then repeat ethanol/ethyl acetate wash procedure.
*Centrifuge for 10 minutes, remove supernatant thoroughly.
*Redissolve protein in 1 ml of 6 M guanidine HCl and 20 mM KH~~2~~PO~~4~~ (final pH should be about 2.5). Sonicate 5 pulses, then incubate 15 min. at 37 &deg;C to fully dissolve protein.
*Measure absorbance in a quartz or UV-transparent cuvette at 375 nm, subtract the absorbance of the reduced BSA, and then determine carbonyl content using &epsilon; = 22000 M^^-1^^ cm^^-1^^.
>>2 mg of reduced BSA should have an absorbance of about 0.026.
*Take a 10-&mu;l aliquot of the oxidized and reduced BSA and do a [[TCA-Lowry protein assay|Lowry protein assay]] to determine the amount of protein remaining (usually about 10% is lost in the procedure). Use this information to determine carbonyl content of the oxidized BSA in nmol/mg protein.
!!Procedure for Preparing Protein Extracts
*Centrifuge 3 ml of the desired culture```Yield from 3 ml culture should be about 200 &mu;g total protein.``` in the microcentrifuge for 2 min at full speed.
*Remove supernatant and wash cells by resuspending pellet gently in 500 &mu;l fresh TE-PMSF```PMSF is @@color: red;very toxic@@. Wear gloves and a dust mask when weighing it out, gloves when working with PMSF-containing solutions.``` buffer.
*Centrifuge 2 min in microcentrifuge at full speed.
*Remove supernatant thoroughly and freeze```Freezing and thawing facilitates lysis of cells.``` pellet at -80 &deg;C for at least 10 minutes (samples can be stored at -80 &deg;C at this stage for later processing).
*Resuspend pellet thoroughly in 500 &mu;l fresh TE-PMSF buffer. Add 50 &mu;l of lysozyme```Lysozyme breaks down the peptidoglycan cell wall and facilitates cell lysis.``` (10 mg/ml), mix and incubate 5 min on ice.
*[[Sonicate|Sonication]] on ice to lyse cells: 4 rounds of 10 1-second pulses at 40% power, cooling on ice between rounds.
*Centrifuge 2 min. at full speed to remove intact cells
*Transfer supernatant (cell lysate, or crude protein extract) to clean tube
*Remove a sample (3-10 &mu;l for [[Lowry protein assay]]. Freeze the remainder at -80 &deg;C if not ready to proceed with the ELISA assay.
>>This sample will allow the total amount of protein in the extract&mdash;soluble and insoluble&mdash;to be determined.
!!Procedure for ELISA###Buss1997######Dalle-Donne2003###
*Print an ELISA [[plate map|docs\ELISA plate map.pdf]] and decide how you will load your samples into the plate.
>>You will need standards containing 0, 0.048, 0.08, 0.16, 0.36 and 0.8 pmol carbonyl groups, and both the standards and your samples should be measured in triplicate.
*Based on the concentration of carbonyl groups in your oxidized BSA, make a standard series with enough 4 mg/ml oxidized BSA to contain 0.048, 0.08, 0.16, 0.36 and 0.8 pmol of carbonyl groups brought to a total volume of 50 &mu;l with PBS.
*For the 0 pmol carbonyl sample, use 50 &mu;l of your 4 mg/ml reduced BSA.
*For each protein extract, add a volume of sample containing 200-300 &mu;g of protein to a microcentrifuge tube and bring the total volume to 50 &mu;l with PBS.
*Add 200 &mu;l of DNPH solution to each tube, mix well and incubate 45 min. at room temperature.
*Transfer 5 &mu;l of each sample to a tube containing 1 ml of coating buffer. Vortex to mix well.
*Transfer 200 &mu;l of each sample and standard to the appropriate wells of the ELISA plate.
>>Be sure you are using an ELISA plate and not the untreated 96-well plates we use for viable counts of bacterial cultures.
*Cover the plate with sealing tape or Parafilm and allow to coat overnight at 4 &deg;C (preferred) or 2 hours at 37 &deg;C.
*Wash plate five times with TBST buffer (300 &mu;l per well), using the wrist-flick technique to fully remove liquid from the wells after each rinse.
*Add 250 &mu;l of TBST to each used well and incubate 30 min. at room temperature to block the plate.
*Wash plate five times with TBST buffer as before.
*Calculate the volume of antibody you will need (200 &mu;l per used well) and dilute the biotin-conjugated anti-DNP antibody (Invitrogen #A-6435) 1:5000 in an appropriate volume of TBST.
>>If reaction happens too fast or absorbance is too high, increase the dilution to 1:10,000 or even higher. If it happens too slowly or absorbance is too low, decrease the dilution to 1:1000.
*Add 200 &mu;l of diluted antibody to each used well and incubate for 60 min. at 37 &deg;C.
*Wash plate five times with TBST buffer as before.
*Calculate the volume of streptavidin-HRP (Invitrogen #SNN2004) you will need (200 &mu;l per used well) and dilute 1:10,000 in an appropriate volume of TBST.
*Add 200 &mu;l of diluted streptavidin-HRP to each used well and incubate 60 min. at room temperature.
*Wash plate five times with TBST buffer as before.
*Add 100 &mu;l of Turbo TMB-ELISA substrate (Pierce #34022) to each used well, mix (can shake at low speed on the plate reader) and incubate about 20 minutes at room temperature.
>>Standard wells should be blue or turquoise; highest standard should have an absorbance in the range of 0.7 at 650 nm when the reaction is stopped.
*Add 100 &mu;l of stop solution (1M H~~2~~SO~~4~~) to each used well, in the same sequence and with the same timing as the substrate, so that each well has reacted for the same length of time. Mix and read absorbance at ''450 nm''.
>>Note the color change from blue to yellow after adding stop solution. Yellow color can be read with more sensitivity on the spectrophotometer.
!!Analysis
*Graph the absorbance vs. pmol carbonyl for the standards.
*Use the equation of the standard curve to determine pmol carbonyl groups in the samples.
*Using your Lowry assay data, determine the number of &mu;g of protein actually added to the wells for each sample (protein extract).
*Divide pmol carbonyl groups by &mu;g protein to get a final oxidation value in pmol/&mu;g so that different samples can be compared.
}}}
!!Rationale
The goal of this project is to dissect the relationship of PCM with other protein-maintenance factors. Using a genetic approach, we will determine whether mutations in other genes involved in protecting, maintaining or degrading proteins exacerbate the phenotypes of a //pcm// mutation. Identification of specific relationships would support our hypothesis, and the nature of the PCM "partners" identified would additionally help to better the define specific //in vivo// role of PCM.

If, as we hypothesize, PCM is involved in maintenance of the conformational stability of proteins //in vivo//, the detrimental effects of a //pcm// mutation may be significantly ameliorated by the actions of chaperons and other protein-maintenance factors active in the cell. This would explain  our observation that PCM contributes measurably to long-term stationary phase survival in //E. coli// only in the presence of significant environmental stress###Visick1998###. We therefore predict that mutations reducing cells' ability to fold or re-fold proteins or resist denaturing stress will unmask a detrimental effect of isoAsp formation in the absence of stress or at least increase the magnitude of the survival defect in a //pcm// mutant strain under stress. The table below lists a number of protein-maintenance genes that we plan to study; we will place the highest priority on the chaperons GroEL, DnaK, HtpG and ClpB and on OtsA, KatE and ClpA, factors specifically associated with stationary-phase survival. //Top priority for 2011 is DnaK, because of its role in disaggregation, connecting to the [[Aggregation]] project//.

|datatable|k
| Gene | Function | Strain | Testable phenotype | Storage |h
|>|>|>|>|!Chaperons|
|//groEL//|refolding, disaggregation|MS60 (//groEL//44 Tn10)###Sherman1992###|ts lethal?| 5-34 |
|//dnaK//|refolding, disaggregation|GW8306 (&Delta;//dnaK//52::Cm)###Bukau1990###<br>MS541 (//dnaK//52::Cm)|| 5-31<br>5-33 |
|//htpG//|folding, oxidative stress|JGT11 (&Delta;//htpG//1:://lacZ//)###Thomas2000###<br>JW0462-1 (htpG::Km)|| N<br>6-29 |
|//clpB//|disaggregation|MC1000 &Delta;//clpB//::Km###Squires1991###||1-57|
|//rpoH//|regulator of heat-shock proteins|BR3637 (mini-Tn10 near //rpoH//15)###Tilly1991###|| N |
|//grpE//|refolding, disaggregation|MS63 (//grpE//280, Cm)```Goldberg, EMBO 11:71 (1992)```<br>DA16 (//grpE//280 //pheA//::Tn//10//)```Ang, [[JB 167:25|http://jb.asm.org/cgi/reprint/167/1/25]]```|<br>ts (44&deg;C); 61% linked to //pheA//| 5-35<br>6-21 |
|//ibpA//|inclusion body "sensor"```Lindner, PNAS 105:3076```|JW3664-1 (ibpA::kan)|| 6-28 |
|//cbpA//|DnaK cochaperone induced at stationary phase```Chenoweth, JB 190:5153```|MC105 (&Delta;//cbpA3//:://cat//)<br>MC108 (&Delta;//cbpM3//:://cat//)|<br>(removes //cbpA// inhibitor)| N |
|>|>|>|>|!Stabilizing agents|
|//otsA//|trehalose (thermoprotectant)|FF4169 (&Delta;//otsA//)###Kandror2002###<br>JW5312-3 (otsA::kan)|| N<br>6-25 |
|//betA//|betaine (osmoprotectant)|FF22 (//betA//1)###Styrvold1986###<br>JW0303-1 (betA::kan)|| N<br>6-24 |
|>|>|>|>|!Antioxidants|
|//katE//|stationary-phase catalase|UM120 (//katE//::Tn10###Loewen1984###||2-77|
|//sodA/sodB//|superoxide dismutase|JW3879-1 (&Delta;//sodA//::Km)<br>JW1648-1 (&Delta;//sodB//::Km)<br>QC772 (//sodA//:://lacZ//), QC773 (//sodA//::Km)###Carlioz1986###|| 7-12<br>7-11<br>N |
|//ahp//|alkyl hydroperoxide reductase|JW0598-2 (&Delta;//ahpC//::Km)<br>JI370 (//ahpCF//::Km)###Seaver2001###|| 7-10 <br> N |
|//msrA//|methionine sulfoxide reductase|JW4178-3 (&Delta;//msrA//::Km)<br>SK8779 (//msrA1//::Km)###Moskovitz1995###|| 7-13<br>N |
|>|>|>|>|!Proteases|
|//lon//|protein turnover, stress response|AMS6L (//lon//::Tc)###Schweder1996###|| N |
|//clpA, X, P//|protein turnover, stationary phase|AMS6A (//clpA//::Tc)<br>AMS6P (//clpP//::Cm)<br>AMS6X (//clpX//::Km)###Schweder1996###|| R<br>R<br>R |
|//pepA, B, D, N, Q//|protein turnover during starvation###Miller1978###|JW4217-6 (pepA::kan)<br>JW2507-1 (pepB::kan)<br>JW0227-1 (pepD::kan)<br>JW0915-1 (pepN::kan)<br>JW3823-1 (pepQ::kan)|| 6-22<br>6-26<br>6-32<br>6-31<br>6-27 |
|>|>|>|>|!Persisters|
|//phoU//|metabolically hyperactive, can't form persisters|JHU313 (//phoU//::Tn10)```Li & Zhang, AAC 51:2092 (2007)```<br>JW3702-1 (phoU::kan)|| N<br>6-30 |
|//ygfA//|5-10x decrease in persisters|Keio coll.```Hansen et al., AAC 52:2718 (2008)```|| N |
|//yigB//|5-10x decrease in persisters|Keio coll.```Hansen et al., AAC 52:2718 (2008)```|| N |
|>|>|>|>|!Others|
|//rpsL//141|hyperaccurate translation (eliminates oxidative "peak")|AF1```Ballesteros, EMBO 20:5820``` (//rpsL141//-Str^^R^^) |str^^R^^| 6-23 |
!!Experimental Design
''Construction of double mutants'':We will introduce mutations in genes encoding various protein maintenance factors into isogenic wild-type (JV1120) and &Delta;//pcm// (JV1121) strains to produce double mutants. [[P1 transduction|Transduction with Phage P1]]###Silhavy1984### will be used to move mutant alleles interrupted by or linked to selectable markers into our strains.

''Phenotypes of double mutants'': We will test long-term survival of the double mutants compared to single-mutant and wild-type strains under the following four conditions:
#''Unstressed'': 10-day survival will be measured in rich medium in the absence of added stress. Under these conditions, single pcm mutations have no detectable effect on survival###Visick1998###.
#''Methanol stress'': 10-day survival will be measured in rich medium in the presence of 1% methanol (added to stationary-phase cultures after 24 h of growth). Single //pcm// mutations produce a modest survival defect, reducing viability about 10-fold after 5-6 days.###Visick1998###
#''Oxidative stress'': 5-day survival will be measured in rich medium in the presence of 0.25-1 mg/ml of paraquat, a redox-cycling drug which allows for sustained production ROS, particularly O~~2~~^^&ndash;^^###Hassan1979###. Single //pcm// mutations produce a moderate survival defect, reducing viability below the detectable level in about 7 days, 2-3 days ahead of wild-type cultures###Visick1998###.
#''Recovery'': length of lag phase will be measured in cultures of cells aged 10 days in stationary phase to which nutrients have been restored. Single //pcm// mutations significantly increase the length of the lag phase.###Hicks2005###
Synergism between the //pcm// mutation and a protein-maintenance “partner” would be recognized as reduced survival of the double-mutant strain in any of conditions (1) through (3) or a further increase in lag phase in condition (4). The two single-mutant strains and the wild-type strain will serve as controls to ensure that any phenotypes observed indeed result from the combination of the two mutations. Where interesting results are obtained, we will verify that the phenotype can be attributed to the genes being tested by complementing with wild-type alleles integrated at the bacteriophage lambda integration site, //attB//.###Diederich1992###. For survival assays, we will use [[spot-plate viable counts|Viable counts]].###Visick1998### Recovery and length of lag phase will be measured using spectrophotometry to monitor cell numbers and a growth-curve modeling computer program, MicroFit.###Baranyi1994,Hicks2005###

For specific research ideas for the immediate future, see the [[project outline|PCM Partners: Project Outline]] for summer 2011. This project also intersects with the [[Aggregation]] and [[PCM Rescue]] projects.
!!Outcomes and future work.
The desired outcome of these experiments is the identification of one or more "partners" which cooperate with PCM in the maintenance of folded, functional proteins in aging and stressed cells. Several lines of evidence support the idea that PCM's //in vivo// role is related to protein folding, and the variety of mechanisms used by the cell to combat the effects of unfolding point toward the potential existence of many such "partners." These would be recognized by a synergistic amplification of //pcm// phenotypes

Any "partner" genes identified in these assays would support our hypothesis that isoAsp repair by PCM and maintenance of protein conformation are interrelated. We anticipate that the nature of the genes identified will help to define the cellular mechanisms most important in responding to isoaspartyl damage—for example, the discovery of chaperon "partners" would suggest an important role for refolding, while protease "partners" would suggest that isoAsp interferes with degradation of proteins too damaged to repair. These clues will suggest the most profitable future directions for investigation. Possible future directions include: (i) determining whether a double-mutant strain can be "rescued" by induction of a complementing //pcm// or "partner" gene either early or late in stationary phase; (ii) biochemical testing of the double-mutant strains for [[aggregation|Aggregation]] or [[oxidation|Oxidation]]; or (iii) identification of a double-mutant combination with a stronger phenotype which could then become the basis of a comprehensive genetic screen, using point or transposon-insertion mutations to look for suppression of this strong phenotype or for genes whose overexpression mitigates the phenotype.
!!Rationale
This project helps test the hypothesis that the major problem caused by isoAsp damage is increased conformational damage (unfolding, local unfolding or susceptibility to unfolding) to proteins and that a major role of PCM is to maintain proteins in their folded state. If this hypothesis were correct, we might imagine that the overproduction of chaperones or proteases or some other factor involved in protein maintenance in the cell might compensate for the absence of PCM in a &Delta;//pcm// mutant. The goal of this project is thus to look for other protein maintenance factors that can reduce or eliminate the phenotypes of a PCM mutant.

You can think of this project as somewhat the opposite of the "[[PCM Partners]]" project. Rather than mutating some other factor to look for worsening of PCM phenotypes, in this project we will overexpress genes encoding chaperones, proteases and other factors to look for lessened phenotypes. The list of possible genes to overexpress would be basically the same as the list given in the [[PCM Partners]] topic. Chaperones and proteases are high priorities, and the highest priority for 2011 is DnaK, because of its disaggregating function (though its partners DnaJ and GrpE might then also have to be overexpressed).
!!Experimental design
Normally, overexpression of a gene of interest is accomplished simply by cloning that gene on a multicopy plasmid and maintaining the plasmid in the desired cell. But, plasmids get flakey in long-term stationary phase: adding antibiotics to select for them in itself affects the survival of the bacteria, and long-term growth in the absence of antibiotics can lead to plasmid loss. So, we will have to:
#Amplify a gene of interest using PCR
#Clone the gene into a plasmid with a promoter for regulated expression of the gene
#Recombine the gene into the chromosome
#Determine whether the gene is in fact expressed at elevated levels in long-term stationary phase
#Measure the effect of overexpression of the gene on survival of aging cells
We'll use the //bla// (&beta;-lactamase) promoter when we want to express a gene [g[constitutively|constitutive]] and the //ara// promoter when we want to be able to [g[induce]] the gene (using the sugar arabinose as an inducer). To introduce the gene into the chromosome, we'll start with a [g[suicide plasmid|suicide_vector]], in this case a plasmid with an origin derived from plasmid R6K. This promoter requires a protein called &pi; (encoded by a gene called //pir//) to replicate; it is a suicide vector in bacterial lacking the //pir// gene.

Our cloning vector must carry a segment of the //E. coli// chromosome where DNA can be added without harm, such as the attachment site for the bacteriophage &lambda; or the transposon Tn7. The gene to be expressed is cloned in the middle of this segment, so now we have our gene to be expressed, plus a promoter, flanked on both sides by //E. coli// chromosome regions. The plasmid will also have a selectable marker, such as an antibiotic-resistance gene. Because this plasmid can't replicate in our target strain, the only way for the antibiotic-resistance gene to be present is for the plasmid to recombine with the matching sequences on the chromosome, effectively placing our gene of interest into the chromosome. If this seems a little confusing, read the introduction to our protocol, [[Chromosomal Integration with pKAS46]].

Verification that the insertion has occurred can be done by PCR unless the gene of interest has a selectable phenotype. Verification that the gene is overexpressed can be done by Western blotting (if an antibody for the protein is available) or possibly by looking for a known overexpression phenotype. Long-term survival of overexpressing strains that carry wild-type //pcm// or a //pcm// deletion can then be determined under stress (methanol, paraquat, etc.) to see whether the phenotypes normally observed for //pcm// mutants will be ameliorated. Using an inducible promoter, it is also possible to see whether expression of the gene will rescue the survival defect of the //pcm// mutants when turned on at various points during stationary phase.
!!Does PCM-mediated repair help protect against denaturing stresses?

[1<i[Long-term survival of pcm mutants (JV1068)<br>treated with paraquat (from Visick, 1998)|wimages/paraquat.png]]''PCM-deficient mutants are impaired in survival of denaturing stresses''. Isoaspartyl damage to proteins occurs spontaneously under physiological conditions,###Clarke1992### suggesting that damaged proteins should accumulate over time in the absence of repair. This should be particularly apparent during long-term stationary phase, when //de novo// synthesis is minimized by nutrient limitation. Indeed, we have shown that PCM-deficient mutants are reduced in viability relative to wild-type cells when challenged with environmental stresses during long-term stationary phase###Visick1998###. After 6-8 days of incubation with paraquat, for example, no viable cells were detectable in a //pcm// mutant culture (&Delta;//pcm//), while wild-type cells persisted for several more days (see figure at left). Survival defects were also observed for //pcm// mutants treated with methanol, osmotic stress or repeated heating###Visick1998###.

These phenotypes are dependent on elevated pH (which occurs naturally in rich media###Hicks2005###), presumably because alkaline conditions accelerate isoAsp formation (see [[PCM and Stationary-Phase Recovery]]). They also occur only in the presence of external stress, suggesting that isoAsp accumulation is deleterious only in combination with other changes in cellular physiology. Specifically, the stresses that result in pcm mutant phenotypes&mdash;oxidative and osmotic stresses, heat and methanol&mdash;have significant effects on protein conformation###Davies1987,Nguyen1989###. To explain this correlation, we propose this hypothesis:
>''Hypothesis 1'': isoAsp damage has a synergistic effect in combination with oxidative or other stresses, destabilizing the conformation of cellular proteins or inhibiting their re-folding once unfolded.
[1>i[Possible effects of isoAsp formation and other<br>environmental stress on protein folding|wimages/folding.png]]''Possible effects of isoAsp on folding''. Our data suggest that isoAsp formation, at least at modest levels, is not directly [G[deleterious]] to protein function: in the absence of additional stress, &Delta;//pcm// mutants survive as well as their wild-type counterparts in long-term stationary phase. This argues against the alternative hypothesis that the primary role of PCM is to restore activity of proteins damaged directly by isoAsp formation at an active-site residue. The appearance of //pcm// phenotypes under stressful conditions suggests instead (see figure at right) that structural changes resulting from the isoAsp damage either:
#destabilize folded proteins, making them more susceptible to stress-induced unfolding, or
#impede refolding once the proteins are denatured by an environmental stress
''Evidence''. Several recent findings lend further strength to our hypothesis. In //Drosophila//, overexpression of PCM extends lifespan only when the flies are subjected to heat stress###Chavous2001###. Flies fed urea, a strong denaturant, showed increases in isoAsp accumulation and PCM activity.###David1999### Additionally, overexpression of PCM was able to suppress aggregation of three different heterologous proteins expressed in //E. coli//.###Kern2005,Wang2006,Zhu2006### To date, however, no experiments have directly addressed the effect of PCM-mediated repair on protein conformation //in vivo//. Our hypothesis predicts that we will be able to identify defects in protein folding or re-folding in //pcm// mutants, and we have proposed both genetic and biochemical experiments to detect such defects (see [[Specific Aims]] and [[Projects]]).
!!Where and when is PCM active in repairing proteins?

[1<i[Isoasp accumulation in stationary phase|wimages/accum.png]]''PCM does not reduce overall isoAsp accumulation in stationary phase''. We measured isoAsp content of proteins in crude cell lysates for young and aged cells (see figure at right) and observed that significant isoAsp damage accumulated in //E. coli// during long-term stationary phase, with more rapid accumulation when cells were cultured at higher pH.###Hicks2005### This finding is consistent with the increased rate of isoaspartyl formation //in vitro// under alkaline conditions,###Brennan1994### which favor deprotonation of the peptide-bond nitrogen and succinimide formation.

To our surprise, however, a mutant lacking PCM (&Delta;//pcm//) did __not__ accumulate more isoAsp than an isogenic wild-type strain, nor did damage accumulate more rapidly. Thus, the [[survival phenotypes|PCM and Protein Folding]] of //pcm// mutants cannot be accounted for simply by an overall increase in isoAsp damage for all cells in the aging culture. Three hypotheses that might explain this unexpected result are:
#PCM effectively repairs proteins only in a minority subpopulation of aging cells
#PCM repairs only cytoplasmic damage, and extracytoplasmic isoAsp accumulation masks any difference
#PCM effectively repairs a small number of critical substrates but has little effect on the majority of proteins in the crude extract.
Based on our results to date (see below), we favor the first option and propose the following hypothesis:
>''Hypothesis 2'': PCM is advantageous primarily after restoration of nutrients allows aged //E. coli// cultures to resume metabolic activity, as well as in subpopulations that are active at any given point during long-term stationary phase.
{{tableRight{<<tiddler [[Tables##Lag]]>>}}}''PCM shortens lag phase for cells recovering from aging''. Growth-curve measurements revealed that after five days of aging in stationary phase, PCM-deficient cells exhibited a significantly (//p// < 0.03) longer lag phase (see table at right) before resuming exponential growth upon restoration of nutrients.###Hicks2005### The increased lag time was observed only for aged cells and only when the fresh medium was buffered to pH9. Generation time was not affected, and viable counts confirmed comparable numbers of viable cells in the inocula.
This result was also unexpected, as we did not that anticipate PCM-mediated repair would be important when cells were not nutrient-limited and could freely synthesize new proteins. We conclude, therefore, that cells that are actively metabolizing might gain an important advantage by being able to repair existing proteins during recovery from stationary phase, even though //de novo// protein synthesis is also occurring. It may also be the case that many of the proteins required for //de novo// synthesis are themselves in need of repair.

''A new model for the role of PCM''. The ability of PCM to expedite recovery from long-term stationary phase, taken together with its lack of detectable effect on isoAsp accumulation //in vivo//, suggests that the generally accepted view that PCM repairs damage as it occurs to maintain protein function in metabolically inactive cells needs to be re-examined.

We propose that enhanced long-term survival of repair-proficient cells results from the activity of PCM in subpopulations of cells which are metabolically active (at the expense of other subpopulations) at a particular time in the dynamic long-term stationary-phase state###Finkel2006###. In this view, PCM-mediated repair would improve the survival rate of currently active aging cells, but the culture as a whole would continue to accumulate isoAsp because PCM has at most a limited role //in vivo// in cells that are genuinely dormant. When those cells that are still viable encounter fresh nutrients, however, we suggest that the enzyme gains renewed importance as the bacteria attempt to utilize those nutrients rapidly and efficiently. Our hypothesis predicts that we will find differences in PCM activity or isoAsp accumulation in subpopulations of stationary cells and during recovery from stationary phase. See [[Specific Aims]] and [[Projects]] for how this hypothesis will be tested.
''Biological effects of PCM''. PCM is distributed throughout the biological world###Kagan1997a###, and PCM-mediated repair can restore activity of many isoAsp-damaged proteins //in vitro//, including epidermal growth factor, histones, glucagon, human growth hormone, calmodulin, calbindin and tubulin.###Clarke1992,Clarke1992b,Galletti1995,Najbauer1996,Young2001### The //in vivo// importance of this repair enzyme has to date been most clearly demonstrated by its strong links with successful aging in a variety of species.

[1<I[//E. coli// lacking PCM (JV1068) are<br>impaired in survival of oxidative<br>stress during long-term stationary<br>phase. (Fig 3 from Visick, 1998)|wimages/colipcm.png]]''PCM and aging''. We have shown that //Escherichia coli// requires PCM for maximal long-term stationary-phase survival in the presence of oxidative and other stresses###Visick1998,Hicks2005###. PCM also increases lifespan in the dauer stage of the nematode //Caenorhabditis elegans//, a state of reduced metabolism in which nutrient-limited worms persist for an extended period###Kagan1997b###. Overproduction of PCM extends the life of //Drosophila// maintained at elevated temperatures###Chavous2001###, while PCM activity in plants is induced in response to stress and during production of seeds&mdash;for many plants, the organ with the greatest potential for longevity.###Mudgett1994,Mudgett1996###

[1>I[Mice lacking PCM die at an early<br>age. (Fig 3B from Kim, 1997)|wimages/mousepcm.png]]Most dramatically, homozygous knockout mice lacking PCM accumulate high levels of damaged proteins in erythrocytes, liver, heart and brain and die of seizures no more than 60 days after birth (see graph at right)###Kim1997###. PCM appears to be of critical importance in the brain: PCM-deficient mice exhibit abnormal cell proliferation in the dentate gyrus (see figure at left)###Farrar2005a###, activation of growth-factor signal-transduction systems###Farrar2005###, and an increased SAM/SAH ratio in the hippocampus###Farrar2002###. PCM also protects certain mouse neurons from apoptosis and can be induced by an anti-Parkinsons drug.###Huebscher1999###

[1<I[The hippocampus and dentate gyrus|wimages/hippocampus.png]]''Human PCM''. Human PCM activity is also high in the brain###Kim1997###, as well as in tissues where we would expect preservation of existing proteins to be crucial, including erythrocytes and eye lens epithelia###Galletti1995###. There is one known genetic polymorphism for the human PCM gene (PCMT1): valine vs. isoleucine at position 119. The valine allele has higher specific activity and heat stability, but the isoleucine variant has higher affinity for isoAsp###DeVry1999###. Initial genetic studies suggest that the heterozygous condition may be correlated with healthy aging###DeVry1999,David1997###, while a recent report suggests that homozygosity for the valine form may decrease risk of spina bifida.###Zhu2005###
{{break{&nbsp;}}}
''PCM and Disease''. In addition to promoting longevity, intriguing connections between PCM and a variety of degenerative diseases point to the need for better understanding of how protein repair contributes to the maintenance of cellular health. A number of recent papers suggest that isoaspartyl modification of proteins may be an important trigger for autoimmune responses###Doyle2003,Mamula1999###, perhaps because isoAsp-containing peptides cannot be completely degraded###Young2001,Mamula1999,Cirrito2001###. Furthermore, recent studies suggest that rates of isoAsp formation are elevated in a lupus-prone mouse model###Yang2006### and that induction of PCM reduces apoptosis and onset of Type 1 diabetes in a rat model###Wagner2007###.

High levels of isoAsp are found in β-amyloid aggregates in Alzheimer’s disease###Lowenson1994###, while decreased PCM activity has been correlated with epilepsy###Lanthier2002### as well as progression of astrocytic brain tumors###LaPointe2005###. Increased isoaspartyl damage has been detected in conjunction with cytoskeletal defects in hereditary spherocytosis###Ingrosso1995###. Conversely, excess SAH levels in uremia inhibit PCM-mediated repair###Perna1997###, perhaps increasing the severity of this disorder.

''How does PCM defend cells and organisms against aging and disease?'' Although it has been well-characterized biochemically, surprisingly little is known about the //in vivo// roles of this protein-repair enzyme. Proteomic approaches have recently identified synapsin###Reissner2006###, collagen###Lanthier2004###, tubulin###Lanthier2002### and histones###Young2001### as targets of PCM-mediated repair, but whether PCM primarily maintains a small number of critical substrates or a broad range of damaged proteins is unknown. PCM might be continuously active as a maintenance enzyme or might respond more specifically to damage or stress. IsoAsp damage might affect protein activity mainly when it occurs near an active site or, as we hypothesize, might affect protein conformation more generally. The involvement of isoAsp formation and repair in such a broad range of pathological conditions strongly suggests that a clearer picture of how, when and where PCM acts //in vivo// is needed.
<!--{{{-->
<div class='header' macro='gradient vert #eee #999'>
<div class='logo'><img src='wimages/logo.png'></div>
<div class='siteTitle' refresh='content' tiddler='SiteTitle'></div>
<div class='searchBox' refresh='content' tiddler='cornerBox'></div>
<span class='siteSubtitle' macro='hideWhen config.options.loggedIn' tiddler='SiteSubtitle' refresh='content'></span>
<span class='siteSubtitle' macro='showWhen config.options.loggedIn'><span id='menuBtns' macro='menuButtons'></span></span>
</div>
<div id='mainMenu' tiddler='MainMenu' refresh='content' force='true'></div>
<div id='displayArea'>
<div id='messageArea'></div>
<div macro='showWhen config.options.loggedIn'>
  <div id='tiddlersBar' refresh='none' ondblclick='config.macros.tiddlersBar.onTiddlersBarAction(event)'></div>
</div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
!!Rationale
[0>i(250,auto)[Persisters remaining after antibiotic treatment<br>(shift-click to enlarge)|wimages/persist.png]]In a culture of stationary-phase ("aging") //E. coli//, not every cell behaves the same way. In particular, persisters have received attention recently, because they are a sub-population of cells that are tolerant of antibiotics—not because of genetic changes but due to metabolic and physiological differences within the population.###Dhar2007,Jayarman2008### Persisters appear to have greatly reduced metabolism, even relative to other stationary-phase cells, allowing them to survive antibiotic treatments that largely kill growing cells (see figure at right). This is interesting to us, because one of our major [[hypotheses|Current Hypotheses]] is that PCM may only be repairing proteins in those stationary-phase cells that are at least transiently metabolically active.
!!Questions for investigation
We can ask many questions about the possible intersection between PCM and persisters. For example:
*What happens to the number of persisters in a culture as the bacteria age in long-term stationary phase?
*Does a //pcm// mutation affect the number of persisters present as the culture ages?
*Does stress (e.g., paraquat, methanol) affect the number of persisters in either wild-type or //pcm// mutant cultures?
*How do mutations that increase or decrease the number of persisters affect the survival of //pcm// mutants?
*Does a //pcm// mutation affect the rate at which persisters resume growth when nutrients are added?
!!Results to date
Recently, Jon Eby asked whether //pcm// mutations affect the percentage of persisters produced and found no clear pattern in one preliminary experiment. However, Kevin Quirke obtained preliminary evidence to suggest that mutants that make produce high levels of pesisters (//hipA// or //hipB// mutations) increased the survival of //pcm// mutants under stress.
!!Experimental design
Persisters can be measured by a relatively simple assay for antibiotic survival.###Hansen2008### We therefore propose to measure persisters in wild-type and mutant cultures during long-term stationary phase with and without stress. We can then combine mutations shown to increase (e.g., //hipA//) or decrease (e.g., //phoU//, //glpD//) the percentage of persisters with our &Delta;//pcm// mutation and observe any effect on survival, using our standard [[survival assay|Long-term Survival of E. coli]]. Using growth curves, we can also measure the length of lag phase and the growth rate for persisters with and without PCM. For more details, see the [[project outline|Persisters: Project Outline]].
{{proctxt{
!!How it works
Boiling //E. coli// in a detergent-containing buffer both lyses the cells and denatures DNA and proteins. As the extract cools, plasmid DNA can renature, but chromosomal DNA remains insoluble and pellets with proteins and most cellular debris. Plasmid DNA is then precipitated from the supernatant with ammonium acetate and isopropanol and washed.

!!Materials
{{proctab{
|[[STET]]|| 300 &mu;l/sample|
|[[Lysozyme]]| 10 mg/ml| 20 &mu;l/sample|
|[[Ammonium acetate/isopropanol]]|| 300 &mu;l/sample|
|[[TE]]| 10:1 mM| 50 &mu;l/sample|
|Ethanol| 70%| 1 ml/sample|
|>|>|Boiling water bath|
}}}
!!Procedure###Holmes1981###
*Transfer 1.5 ml of fresh, saturated overnight culture```For higher-quality DNA (e.g., for sequencing), grow cells overnight at room temperature without shaking, then transfer to shaker at 37 &deg;C for four hours and proceed with plasmid prep.``` into a microcentrifuge tube and spin for 30 seconds in microcentrifuge at full speed.
*Remove supernatant; resupend cells in 0.3 ml of STET by pipetting up and down
*Add 20 &mu;l of lysozyme and incubate 1-2 min. at room temperature```This step is dispensable for //E. coli//; for //Salmonella//, increase incubation to 30 min.```
*Heat to 100&deg;C in a boiling water bath for 90 seconds
*Spin 5 minutes in microcentrifuge
*Carefully scoop out pellet with a sterile toothpick and discard
*Add 300 &mu;l of ammonium acetate/isopropanol and mix well by inverting 20 times
*Spin for 5 minutes in microcentrifuge at full speed
*Pour off supernatant, add 1 ml of 70% ethanol and spin 3 minutes in microcentrifuge
*Dry pellet thoroughly
*Resuspend carefully in 50 &mu;l of 10:1 mM TE
*Typical yield is 1-5 &mu;g of plasmid DNA
}}}
<<plugins>>
{{proctxt{
!!Procedure
*Calculate amount of growth medium needed based on 25 ml per plate.
*Add agar (unless included in a commercial mix) at 15 g/l.
*Prepare medium in a media flask.
>//Use a flask at least twice as large as the volume of medium needed, to avoid boil-over problems during autoclaving.//
*Add desired volume of water, swirl to mix well.
>//No stir bar needed for most ordinary media.//
*Cover flask with foil and add a small square of autoclave tape.
*Turn on the 50 &deg;C water bath adjacent to the autoclave.
>//Be sure it has about 5 cm of water; add more (@@color: blue;''dH~~2~~O only''@@) if needed.//
*Autoclave medium 15-20 min. at 15 psi (121 &deg;C) on @@color: blue;''fluid''@@ cycle.
*Remove medium promptly after autoclaving (with gloves) and transfer to 50 &deg;C water bath.
>//Allow about 15 min. to cool to pouring temperature (water bath thermometer should return to about 50 &deg;C).//
*@@color:blue;''Mix thoroughly''@@ by swirling the flask.
>//Agar is heavier than water and will settle to the bottom; if not well mixed, you'll get some sloppy plates and some too-solid plates.//
*Add any needed antibiotics or other supplements and mix thoroughly.
*Pour enough agar into each plate so that it just covers the bottom by itself with no swirling.
>//This should be about 25 ml per plate (bottom half about half full as seen from the side).//
*Let harden 15-20 min.
*Invert plates and incubate about 24 hrs at 37 &deg;C to dry.
*Place in a plate bag and refrigerate.
}}}
{{proctxt{
!!How it works
[0>I[Generalized transduction<br>(student.ccbcmd.edu/courses/bio141)|wimages/gentran.gif]]Many bacteriophages break up host DNA during their replication cycle. Some&mdash;''transducing phages'', such as phage P1 in //E. coli//&mdash;are not terribly picky about the DNA they package into the new phage particles, so they can inadvertently package a segment of the host genome instead of their own genome. When this happens, we have a phage that can [G[transduce|transduction]] a genome segment from one cell to another (lacking a genome, that phage cannot replicate in the new host). The transduced segment can then recombine into the chromosome, replacing [G[homologous|homologous]] genes. This procedure describes how to infect a host with a desired genetic marker with phage P1 and obtain a [G[lysate|lysate]] containing phage progeny, including transducing phage carrying the gene of interest.

!!Materials
|proctab|k
|[[CaCl2]]| 0.1 M| 250 &mu;l per sample|
|[[Glucose]]| 20 %| 50 &mu;l per sample|
|P1//vir// phage stock| ~5&times;10^^8^^ pfu/ml| 100 &mu;l per sample|
|Chloroform| |100 &mu;l per sample|
|LB broth| | 10 ml per sample|

!!Procedure###Silhavy1984######Miller1972###
*Grow donor strain overnight in LB broth.
*Dilute overnight culture 1:100 (50 &mu;l) in 5 ml of LB broth containing 0.2% glucose (50 &mu;l of 20%) and 5 mM CaCl^^2^^ (250 &mu;l of 0.1M)```Calcium is required for phage adsorption and to prevent sensitivity to chloroform.```.
*Incubate for 30 min. at 37 &deg;C with aeration```Cultures will not lyse if the starting cell density is too high. Miller recommends growing the cells for one hour at 37°C without shaking prior to adding the phage.```.
*Add 0.1 ml of P1//vir// phage stock```The ratio of phage to bacteria should be greater than 1:1. Miller recommends 0.1 ml of phage at 10^^9^^ pfu/ml for 5 ml of culture grown one hour without aeration.``` and shake or rotate at 37 &deg;C for 2-4 hours, until cells lyse (culture clears). If no clearing is seen by four hours, continue with procedure```Cultures that do not visibly lyse will often yield usable lysates. However, plate lysates generally yield a higher titer of phage and can be used to amplify a low-titer phage```.
*Add 0.1 ml of chloroform and vortex vigorously for at least 30 seconds.
*Centrifuge 10 min. at 4500 &times; //g//.
*Transfer supernatant to a sterile screw-cap tube, add 0.1 ml chloroform, vortex vigorously.
*Store at 4 &deg;C.
}}}
North Central's "coli lab" - where PCM is our YFP!
This page connects to the [[Specific Aims]] page, where our two Aims and four sub-Aims lay out how we would like to test our two [[Current Hypotheses]]. Here, we list specific projects that students can work on related to each sub-Aim. Each project title links to detail pages where the goals of that project and some basic experimental outlines are laid out (you can also use the Projects menu to reach these pages more quickly). Projects identified with the [img[see 2011 projects|icons/2011.png][Summer 2011 Projects]] icon are high-priority projects for summer 2011.
!!Hypothesis 1
>''isoAsp damage has a synergistic effect in combination with oxidative or other stresses, destabilizing the conformation of cellular proteins or inhibiting their re-folding once unfolded''
Remember that this hypothesis emerges from the finding that PCM enhances long-term survival of //E. coli// only in the presence of a protein-denaturing stress (e.g., methanol, oxidative stress, osmotic stress, heat stress; see [[PCM and Protein Folding]]. We propose that effects of isoAsp formation on proteins //in vivo// are initially local in scope, becoming important for survival only as environmental changes favor protein unfolding. In this view, a major role for PCM-mediated repair of isoAsp damage would be to stabilize protein conformation, protecting proteins from conformational changes that would otherwise result from the combination of unrepaired isoAsp and a denaturing stress.

How might isoAsp damage and denaturing stresses synergize to overcome the cell’s conformational maintenance systems (e.g., [g[chaperons|chaperon]], proteases, [g[osmoprotectants]]) and impair survival of aging cells? Here are four possible models:
#Unrepaired isoAsp "kinks" in the peptide backbone may cause local unfolding or decrease the stability of a folded protein, so that it unfolds readily when exposed to further stress. In this model, localized disruptions due to isoAsp formation (as demonstrated in vitro for ribonuclease A###Capasso1996###) would have little effect on protein activity alone but might expose otherwise-hidden regions of the protein to environmental damage.
#Local unfolding due to environmental challenge may be the first step in the process, accelerating isoAsp damage by exposing buried Asp and Asn residues or producing more flexible domains where isomerization occurs rapidly.###Brennan1994###
#Although denaturing stress may be the primary agent of unfolding, unrepaired isoAsp "kinks" may inhibit __re__-folding by chaperons that would otherwise be sufficient to mitigate the conformational damage. Damaged protein that can’t be promptly re-folded could also interfere with folding/refolding of undamaged proteins, such as by binding up chaperons.###Polyakova2005###
#Unrepaired isoAsp may inhibit the degradation of proteins with irreparable conformational damage, potentially reducing the pool of available amino acids or producing peptides that might be toxic.###Reeve1984###
!!!Aim 1A: Dissect the relationship of PCM with other protein-maintenance factors
''Projects'' that address this Aim:
*[[PCM Partners]]: What other protein-maintenance mutations would have synergistic effects on //pcm// phenotypes? [img[see 2011 projects|icons/2011.png][Summer 2011 Projects]]
*[[PCM Rescue]]: What protein-maintenance factors could "rescue" repair-deficient cells? [img[see 2011 projects|icons/2011.png][Summer 2011 Projects]]
!!!Aim 1B: Probe protein conformation //in vivo//.
''Projects'' that address this Aim:
*[[Aggregation]]: Do //pcm// mutations increase unfolded ([g[aggregated|aggregation]]) protein? [img[see 2011 projects|icons/2011.png][Summer 2011 Projects]]
*[[Oxidation]]: Do //pcm// mutations increase oxidized protein?
*[[Monitoring Folding]]: Do Asp- and Asn-rich proteins become unfolded in aging cells? [img[see 2011 projects|icons/2011.png][Summer 2011 Projects]]

!!Hypothesis 2
>''PCM is advantageous primarily __after__ restoration of nutrients allows aged //E. coli// cultures to resume metabolic activity, as well as in subpopulations that are active at any given point during long-term stationary phase''.
Remember that this hypothesis resulted from the finding that //pcm// mutants fail to accumulate more isoAsp during long-term stationary phase than wild-type cells###Visick1998a###, but that they have a longer lag phase once nutrients are restored###Hicks2005### during which protein repair might be occurring (see [[PCM and Stationary-Phase Recovery]]).

We propose that although PCM is active during exponential growth and in stationary phase (e.g., after 24-48 h of growth) in //E. coli//, its activity during long-term stationary phase may be limited by factors such as:
#Minimal protein synthesis (in general or for PCM specifically)
#Instability of the enzyme
#Limiting concentrations of the methyl donor, [g[S-adenosyl methioinine|SAM]]
#Accumulation of the inhibitory product [g[S-adenosyl homocysteine]]
This would explain why even repair-proficient cells are unable to prevent isoAsp accumulation during aging. Upon restoration of nutrients, however, wild-type cells may be able to recover more rapidly as the adverse condition(s) are alleviated and PCM activity increases, allowing a combination of new protein synthesis and repair of existing proteins. During long-term stationary phase itself, where some cells divide at the expense of others and selective pressures favor the growth of genetically distinct subpopulations as conditions change,###Finkel1999### PCM may enhance survival by repairing isoAsp in subpopulations of cells that encounter nutrients (e.g., molecules released by lysis of other cells) and are temporarily active. This hypothesis contradicts to some degree the prevailing view that PCM is available to repair damage as it occurs in non-metabolizing cells, such as in stationary-phase //E. coli//, dauer-stage //C. elegans// and plant seeds. While PCM is clearly important for survival in all of these cases, our data suggest that it may exert its effect only once those cells have recommenced metabolism.
!!!Aim 2A: Determine when and where PCM repairs damage in stationary-phase //E. coli//.
''Projects'' that address this Aim:
*[[PCM Parameters]]: Measure isoAsp damage, PCM activity, SAM and SAH in aging and recovering cells
*[[Viable/Inviable]]: Measure isoAsp damage and PCM activity in viable and inviable aging cells
*[[Persisters]]: Investigate the possible relationship between numbers of metabolically static [g[persisters]] and PCM phenotypes [img[see 2011 projects|icons/2011.png][Summer 2011 Projects]]
*[[Fractionation]]: Examine the alternative hypothesis that PCM activity may be spatially, not temporally, constrained
!!!Aim 2B: Separate protein aging from starvation in a novel model system
*[[Stasis]]: Analyze the role of PCM in cells translationally arrested by RelE

!!Additional current projects
*[[Competition]]: Preliminary results from an ecology project suggested that &Delta;//pcm// mutants might be out-competed by the wild-type strain. We are constructing marked strains lacking antibiotic resistance to test this more rigorously.
*[[Capillary Electrophoresis]]: Develop a protocol for the sensitive, non-radioactive detection of isoAsp and measurement of PCM activity using capillary electrophoresis to detect [g[SAH]]
{{mHead{Projects:}}}
<<forEachTiddler
  where 'tiddler.tags.contains("project") && !tiddler.tags.contains("outline") && tiddler.title != "Projects"'
  write '"*[["+truncate(tiddler.title,18)+"|"+tiddler.title+"]]\n"'
  >>
----
{{mHead{Project outlines:}}}
<<forEachTiddler
  where 'tiddler.tags.contains("outline")'
  script 'function getProj(fTitle) { return fTitle.substr(0,fTitle.indexOf(":")); }'
  write '"*[["+getProj(tiddler.title)+"|"+tiddler.title+"]]\n"'
  >>
----
[[main Project page|Projects]]
''Prevention and repair of macromolecular damage are crucial to the survival of a cell''. Spontaneous and environmentally induced alterations of macromolecules have been implicated in diseases such as diabetes, atherosclerosis, Alzheimer’s disease, autoimmune disorders and cancer, as well as in the aging process###Johnson1999###. Even in the absence of damaging environmental agents, the myriad chemical reactions occurring within cells pose a constant threat to the integrity of macromolecules. Generation of [G[ROS|ROS]], for example, is an inescapable consequence of oxygen-dependent metabolism which can damage proteins, lipids and DNA###Berlett1997###. Other forms of spontaneous damage include unfolding of proteins, mutation of DNA, damage to chromosomes and the cell-division machinery, and oxidation and other chemical alterations of amino acids###Bree2002######Soti2002###.

[1<I[Proteins are subject to conformational (unfolding) damage (left)<br>as well as covalent (chemical) damage (right)|wimages/damage.png]]''Covalent and conformational protein damage''. Whereas [G[covalent protein damage|covalent_damage]] is alteration of the primary amino-acid structure of the protein###Visick1995### (such as oxidative modification resulting from [G[ROS]]###Linton2001###), [G[conformational protein damage|conformational_damage]] is disruption of the three-dimensional structure of a folded protein###Visick1995###. Conformational damage can reduce or eliminate the function of an individual protein and may lead to formation of non-functional or even pathological aggregates as hydrophobic regions become exposed.###Lowenson1994###

Conformational damage can be mitigated by a number of well-studied [G[chaperon]] systems. The Hsp60 family, represented by GroEL in //E. coli//, can re-fold partially denatured proteins###Ben-Zvi2001###, while chaperons such as DnaK (Hsp70 family) or ClpB (Hsp104 family) can both re-fold and disaggregate conformationally damaged substrates###Glover1998,Parsell1993###. Additionally, protective agents such as [G[betaine]] and [G[trehalose]] stabilize protein conformation and further help reduce the incidence of covalent damage###Diamant2001###. [G[Proteases|protease]] can also be seen as damage-response systems, since prompt degradation of proteins that cannot be readily refolded is an important means of limiting their negative effects###Davies1998###.

''Deterioration of protein function'' often involves the interplay of covalent and conformational damage. Oxidative damage, for example, is a common cause of unfolding and aggregation###Levine2001,Squier2001###, while misfolded proteins become more susceptible to covalent attacks###Nyström2003###. Prevention of covalent damage by superoxide dismutases, [G[catalases|catalase]], and glutathione thus plays a role in maintenance of protein conformation###Linton2001###, and one can readily imagine that repair of covalent damage might have a similar function in mitigating conformational damage.
''Protein damage'' can be divided into two major classes: conformational and covalent###Visick1995###. As shown in the diagram below, [G[conformational damage|conformational_damage]] refers to unfolding of the protein&mdash;loss of the specific three-dimensional shape that is essential to the normal function of any protein. Conformational damage can result from heating, attack by free radicals, chemicals, pH changes, etc. 

[G[Covalent damage|covalent_damage]] is a chemical change in the amino acids that make up the protein, such as oxidation, isomerization or formation of [[isoaspartate|Isoaspartyl Formation]]. Many of these changes can occur spontaneously or can be induced or accelerated by environmental factors. Both kinds of damage can drastically affect protein function.

[0I[Overview of protein damage and repair|wimages/prepair.gif]]
Repair of protein damage depends on (i) the ability to recognize a change in a protein as abnormal, and (ii) a means of reversing the change. The best-known protein-repair mechanisms are the well-studied [G[chaperon|chaperon]] systems for refolding conformationally damaged proteins###Bukau1998###. Detecting covalent damage is more difficult, but several covalent repair systems have been identified, including methionine sulfoxide reductase###Stadtman2002###, peptidyl-prolyl isomerases###Göthel1999### and the L-isoaspartyl protein carboxyl methyltransferase (or PCM), which repairs isoaspartate and is discussed in detail on the following pages. Proteins that cannot be repaired are eventually degraded and recycled.

''Why repair proteins?'' Certainly, repairing any damage to DNA is critical, and many DNA repair systems are well-known. Proteins, however, seem dispensable at first glance: as long as its DNA is intact, a cell can synthesize new copies of proteins indefinitely. But what happens when protein synthesis is limited? For example, human red blood cells lack nuclei yet must function in circulation for 120 days without making new proteins. Nutrient-limited bacteria drastically reduce metabolism, including translation of proteins. The crystallin proteins in the lens of the eye are never replaced during an individiual's lifetime. And any cell which is not rapidly growing and dividing becomes more dependent on its existing proteins. Protein synthesis is "expensive" to a cell, and repair can be a cost-effective alternative to replacement when damage can be readily recognized.
''Why repair proteins?'' When protein damage is detectable by enzymes, repair is a frugal alternative to replacement, particularly when new protein synthesis is limited. While not as well-studied as DNA repair, protein repair mechanisms have gained increasing recognition in recent years as a means of restoring function to damaged macromolecules###Visick1995###. Striking examples of the need for repair include human erythrocytes (which circulate for 120 days with no new protein synthesis###Galletti1995###), eye lens proteins (never replaced in the lifetime of the individual###Kagan1997###) and bacteria in stationary phase (which can survive for years with no added nutrients###Finkel2006###). Maintaining function of existing proteins can become critical for //any// cell, however&mdash;such as when nutritional conditions limit protein turnover, or as //de novo// protein synthesis declines in aging tissue###Ryazanov2002###.
{{break{&nbsp;}}}
<html><div class="swfdiv"><embed class="swfbox" height="172" width="292" name="pcm_anim" src="wimages/pcm_anim.swf" scale="noscale" loop="false" play="false" quality="high"></embed><form class="swfControls"><input type="button" value="" name="play" onClick="playFlash('pcm_anim');"><input type="button" value="" name="stop" onClick="pauseFlash('pcm_anim');"></form></div></html>[1<I[Repair of isoAsp mediated by<br>PCM-dependent methylation|wimages/repair.png]]''Protein repair enzymes''. For [G[conformationally damaged|conformational_damage]] (unfolded) proteins, [G[chaperons|chaperon]] are the best-known repair enzymes, catalyzing disaggregation and refolding of proteins###Bukau1998###. There are also several known systems that repair [G[covalent|covalent_damage]] (chemical) damage, including methionine sulfoxide reductase, disulfide reductases and peptidyl-prolyl isomerases###Visick1995######Davies2000###. PCM is the best-studied repair enzyme for covalent protein damage. PCM recognizes and repairs [G[isoAsp|isoasp]] resulting from [[isomerization|Isoaspartyl Damage]] at [G[Asp|asp]] and [G[Asn|asn]] amino acids within proteins###McFadden1987###. As its name suggests, it initiates repair by specifically methylating the carboxyl group of an isoAsp (see animation at right and figure at left).

The unstable methyl ester thus formed stimulates spontaneous re-formation of the succinimide intermediate. Subsequent hydrolysis (see [[Isoaspartyl Damage]]) either restores a normal Asp, or regenerates isoAsp. If isoAsp re-forms, it can be re-methylated, resulting eventually in net repair of isoAsp to aspartate. The methyl donor for this reaction is [G[SAM|SAM]], which is converted to [G[SAH|SAH]]. In eukaryotes, PCM also recognizes and repairs D-aspartyl residues resulting from [G[racemization]] of the succinimide.
{{break{&nbsp;}}}
PCM-mediated repair appears to play a key role in protection from aging and other disorders, discussed on the [[next page|PCM vs Aging and Disease]]
[[Isoaspartyl damage|Isoaspartate Formation]] occurring spontaneously and accumulating over time could reduce protein function sufficiently that a cell could no longer carry out its normal activities. However, isoAsp can be readily recognized as a site of damage, because this amino acid is normally not found in proteins. The L-isoaspartyl protein carboxyl methyltransferase (PCM for short; also known as PCMT in mammals and PIMT in some other organisms), is an enzyme capable of specifically recognizing isoAsp in proteins###Geiger1987###. This enzyme is nearly universal in the living world, having been found in bacteria, nematodes, insects, plants, mammals and humans###Kagan1997###.

''PCM'' specifically methylates isoAsp residues (shown below) by transferring a methyl (CH~~3~~) group from S-adenosylmethionine ([G[SAM|SAM]])###McFadden1987###. The methylated isoAsp readily re-forms the succinimide intermediate, which can again be hydrolyzed into either normal Asp or isoAsp. The net result (perhaps requiring multiple rounds of methylation and hydrolysis) is repair of isoAsp to normal Asp.
[0I[Repair of an isoaspartyl by PCM|wimages/pcmrepair.gif]]
''Fountain of youth?'' Protein function can be restored or improved when PCM is allowed to repair damaged proteins###Clarke2003###, suggesting the potential importance of PCM for aging cells that may accumulate isoAsp damage over time. Several lines of evidence support the idea that PCM is an important cellular defense against aging:
*Mice lacking PCM have an average lifespan of only 42 days and die of seizures resembling epilepsy###Kim1997###.
*Plants activate PCM synthesis in response to stress and during seed formation; long-lived seeds have high levels of PCM###Mudgett1994###.
*Increased PCM expression in //Drosophila// subjected to heat stress improves their longevity###Chavous2001###.
*Bacteria###Visick1998### and nematodes###Kagan1997### require PCM to survive during periods of low metabolic activity.
Ongoing studies are investigating when, where and how this enzyme functions to maintain protein activity and help cells age successfully.
{{col3{
<<forEachTiddler
  where 'tiddler.tags.contains("protocol")'
  write '"[["+ tiddler.title +"]]\n"'
  >>
}}}
<<forEachTiddler
  where 'tiddler.tags.contains("protocol")'
  write '"*[["+truncate(tiddler.title,18)+"|"+tiddler.title+"]]\n"'
  >>
[[Protocol index|ProtocolIndex]]
*[[Research Overview]]
*[[Scientific Background]]
*[[Current Hypotheses]]
*[[Specific Aims]]
*[[Results]]
*[[Lab Members|Current Lab Members]]
!!How it works
<<icap "[>img[Oxidation of lysine to form carbonyl-containing allysine|images/oxidation.png]]">>When the amino acid threonine, arginine, lysine or proline is oxidized, a [G[carbonyl|carbonyl]] group forms. The carbonyl content of proteins can therefore be used as a measure of how much protein oxidation has occurred. [G[DNPH|DNPH]] reacts with carbonyl groups in proteins and forms dinitrophenylhydrazones, which can be quantitated using a spectrophotometer. In this assay, we lyse cells, remove nucleic acids, react proteins with DNPH. Because there may be variability in the efficiency of lysing cells and recovering proteins, we also use a [[Lowry protein assay]] to measure the total protein content of the extract.
!!Materials
{{proctab{
|[[PBS]]||1 ml/sample|
|[[Streptomycin sulfate]]|10%|110 &mu;l/sample|
|[[DNPH]]|2 mg/ml|1 ml/sample|
|[[HCl|HCl (2N)]]|2N|1 ml/sample|
|[[TCA|TCA (20%)]]|20%|2.5 ml/sample|
|[[Ethyl acetate/EtOH]]|1:1|10 ml/sample|
{{proctxt{
!!Procedure###Dalle-Donne2003,Buss1997###
*Centrifuge 15 ml of culture```Yield from 15 ml culture should be about 1 mg total protein.``` for 10 min at 2000 × g and 4&deg;C to pellet cells. Resuspend in 1 ml of PBS.
*Keeping samples on ice, sonicate 20 sec. with microtip.
>Use 1-second pulses and 40% power. Do not allow samples to get warm. Repeat sonication until each sample has been sonicated 4×. Let stand on ice between rounds to keep cold.
*Centrifuge 10 min. at full speed and 4&deg;C in refrigerated microcentrifuge to pellet unbroken cells and debris. Transfer supernatant to a clean tube.
*Add 110 &mu;l of 10% streptomycin sulfate, vortex for 30 sec. and incubate 30 min. at room temperature.
>This step will precipitate nucleic acids, which otherwise react with DNPH and interfere with the assay.
*Centrifuge 10 minutes at 6000 × //g// to remove precipitated nucleic acid. Transfer supernatant to clean tube.
*For each sample, prepare four microentrifuge tubes with 125 &mu;l of extract in each.
>Two tubes will be reacted with DNPH, and the other two will be treated with HCl (the solvent for DNPH) only and will serve as blanks. The samples are split into two tubes only for convenience, as the volumes are too large for microcentrifuge tubes otherwise.
*As a standard, prepare two tubes, each with 100 ng of carbonyl BSA in 125 &mu;l PBS.
*Add 0.5 ml of 2 mg/ml DNPH to two tubes for each sample, and 0.5 ml of 2N HCl (no DNPH) to the blank tubes for each sample. Incubate 45 min. in the dark at room temperature, vortexing every 10 min. (Or use tube rotator in dark.)
>This is the step in which the DNPH reacts with the carbonyl groups in the proteins. The blank is treated the same way so that any color which is due only to reaction with HCl can be subtracted.
*Add 625 &mu;l of cold 20% TCA to each tube, mix well, and let stand 10 min on ice. Centrifuge 10 min. at full speed in refrigerated microcentrifuge.
>TCA precipitates proteins, allowing unreacted DNPH to be washed off.
*Remove supernatant with vacuum aspirator.
*Wash the pellets 5× by adding 0.5 ml of 1:1 ethanol/ethyl acetate to pellet, centrifuging 5 minutes and removing supernatant with vacuum aspirator each time.
*Resuspend the pellets in 125 &mu;l of 6M guanidine HCl. Vortex thoroughly, incubate 10 minutes at 37&deg;C and vortex again to dissolve as much protein as possible. Centrifuge 10 min. at full speed in a microcentrifuge to remove any debris. Centrifugation step may be repeated if necessary.
>Guanidine HCl is a strong protein denaturant used to solubilize proteins.
*Combine the two supernatants for each sample into a single tube. Combine the two supernatants for each blank into their own single tube.
*Remove 10 &mu;l from each sample and each blank and dilute it to 100&mu;l with PBS in a separate tube. Set aside. These samples should be used to determine total protein concentration by the [[TCA-Lowry|TCA-Lowry Method for Protein Quantitation]] procedure.
*For the remaining supernatant for each sample and blank, add 1 ml of 6M guanidine HCl, transfer to a semi-micro cuvette and read absorbance at 375 nm. Blank the spectrophotometer with the appropriate blank for each sample.

!!Analysis
*Determine absorbance at 375 nm for each sample minus its corresponding blank. This can be done by reading A~~375~~ for each sample and blank and subtracting (blanking the spectrophotometer with dH~~2~~O), //__or__// by blanking the spectrophotometer with the appropriate blank before reading each sample.
*Determine nmol of carbonyl/ml by multiplying the blank-subtracted A~~375~~ (absorbance at 375 nm minus the blank) by 45.45 (extinction coefficient of DNPH in nmol/ml) to get nmol carbonyl/ml.
*Determine the total protein concentration for each sample by [[TCA-Lowry|Lowry protein assay]] assay and calculate mg total protein per ml of the final solution in guanidine HCl.
*Divide nmol/ml carbonyl by mg/ml protein to get nmol of carbonyl/mg total protein.
}}}

{{col3{
<<forEachTiddler
  where 'tiddler.tags.contains("recipe")'
  write '"[["+ tiddler.title +"]]\n"'
  >>
}}}
<<forEachTiddler
  where 'tiddler.tags.contains("recipes")'
  write '"[["+tiddler.title+"]]"'
  >>
[[Recipe index|RecipeIndex]]
!!How it works
Electroporation cuvettes must be free of both DNA and bacteria, as well as any salts that would lead to arcing. They are expensive enough that it can be cost-effective to recycle them, especially for non-critical applications.```Do not recycle cuvettes used to electroporate //Bacillus// or other spore-forming bacteria.``` In this protocol, HCl is used to destroy any residual DNA, and 70% ethanol is then used to kill bacteria and rinse away the HCl; because it is volatile, it can be removed by simple evaporation.
!!Materials
{{proctab{
|HCl| 0.2 N|
|EtOH| 70 %|
}}}
{{proctxt{
!!Procedure
*This procedure should be carried out as soon as possible after using the cuvette, to avoid corrosion.
*Rinse cuvette 10&times; with dH~~2~~O to remove most bacteria, DNA and salts.```Be sure that all the liquid is removed from between the electrodes each time. Otherwise, it's not really getting rinsed.```
*Fill the cuvette and its cap with 0.2 N HCl and let stand 10 minutes.```Do not let stand longer than 10 min., or corrosion of the electrodes can occur.```
*While the cuvette is incubating, turn on the UV in the biological safety cabinet.
*Rinse the cuvette and its cap 5&times; with 70% EtOH to remove the HCl and sterilize the cuvette.
*Turn the UV off and pour off the last ethanol rinse under the hood. Use a sterile, disposable Pasteur pipette to remove as much of the ethanol as possible.
*Turn the UV back on and let the cuvette and its cap air dry for 60 min to remove the ethanol.
*Cap the cuvette.
!!References
[[Bitesize Bio blog|http://bitesizebio.com/2008/04/30/re-cycling-electroporation-cuvettes/]]
}}}
// // Macro newRef: Create a new reference populated with PubMed data from a PMID
//{{{
config.macros.newRef = {
  label: "New reference",
  prompt: "Create new reference with entered data or PubMed lookup"
  };

config.macros.newRef.handler = function(place) { createTiddlyButton(place,this.label,this.prompt,this.onClick); };

config.macros.newRef.onClick = function(e) {
  config.macros.newRefStart();
  };

config.macros.newRefStart = function () {
  var PMID = prompt("Enter PubMed PMID or blank for manual data entry", "");
  if (PMID == null || PMID == undefined) return false;
  if (PMID == "") {
    var refID = "";
    while ( refID == "" ) {
      var refID = prompt("New reference ID:\nEnter last name of first author and year (no spaces: Smith2011)","");
      if (refID == null || refID == undefined) return false;
      }
    refID = uniqueRef(refID);
    store.saveTiddler(refID,refID,"",config.options.txtUserName,new Date(),"ref");
    story.displayTiddler(null, refID);
    config.commands.editTiddler.handler(null, null, refID); 
    return false;
    }
  else { fetchPubMed(PMID,0); }
  };
//}}}

// // Function called by AJAX after PMID retrieve for a new reference
//{{{
function createNewPMID(refFields) {
  clearMessage()
  var tid = uniqueRef(refFields.refID);
  refFields.refID = tid;
  store.saveTiddler(tid,tid,"",config.options.txtUserName,new Date(),"ref");
  setRefFields(refFields);
  saveChanges();
  story.displayTiddler(null,tid);
  jQuery(".aform").show()
  };
//}}}

// // Function to append a,b,c... until a unique reference ID is created
//{{{
function uniqueRef(refID) {
  newID = refID;
  var i = 97;
  while (store.tiddlerExists(newID)) {
    newID = refID + String.fromCharCode(i);
    i++;
    }
  return newID
  };
//}}}

// // Macro getPMID: Button to get or update data for current reference using PMID (use within a reference tiddler or toolbar)
//{{{
config.macros.getPMID = {
  label: "Get PubMed data",
  prompt: "Use PMID to retrieve reference from PubMed"
  };

config.macros.getPMID.handler = function(place) { createTiddlyButton(place,this.label,this.prompt,this.onClick); };

config.macros.getPMID.onClick = function(e)
 { var tid=story.findContainingTiddler(this);
   var title=tid.getAttribute('tiddler');
   if ( tiddler.fields.pmid == "" || tiddler.fields.pmid == null || tiddler.fields.pmid == undefined ) {
     var PMID = prompt("Enter PubMed PMID", "");
     if (PMID == null || PMID == undefined) return false;
     }
   else { var PMID = tiddler.fields.pmid; }
debugger;
   fetchPubMed(PMID,1,title);
   };
//}}}

// // Function called by AJAX after PMID retrieve to update an existing reference
//{{{
function updatePMID(refFields,title) {
  clearMessage()
  var tid = store.getTiddler(title);
  store.saveTiddler(title,title,tid.text,config.options.txtUserName,new Date(),tid.tags,tid.fields);
  setRefFields(refFields);
  saveChanges();
  story.refreshTiddler(title,null,true);
  };
//}}}

// // AJAX Function to retrieve and process a PubMed record
//{{{
function fetchPubMed(PMID,qmode,title) {
  displayMessage('Fetching from PubMed...');
  var args  = { 'apikey' : 'ac329f4b439fbca0d2e61cdd90a40509',
	            'db' : 'pubmed',
	            'term' : PMID,
                    'retmax' : 1    // maximum number of results from Esearch
                    };
  jQuery.getJSON('http://entrezajax.appspot.com/esearch+efetch?callback=?', args, function(data) {
    //if there's an error in getting the PubMed data, report and cancel
    if(data.entrezajax.error == true) {
      alert("EntrezAjax failed with error " + data.entrezajax.error_message);
      return;
      }
    //if no PubMed data is retrieved (e.g., a bad PMID), report and cancel
    if(data.entrezajax.count == 0) {
      alert("No records returned for PMID " + PMID);
      return;
    }
    //process retrieved PubMed record
    var refFields = processData(data.result[0]);
    //call appropriate function for new or update reference tiddler
    if (qmode == 0) { createNewPMID(refFields); }
        else { updatePMID(refFields,title); }
    });
  };
//}}}

// // Functions to process PubMed data to appropriate format for reference tiddler fields, creates refFields object
//{{{
function processData(PMItem) {
  var refFields = new Object;
  
  //process author list
  refFields.firstAuthor = PMItem.MedlineCitation.Article.AuthorList[0].LastName;
  var alist = PMItem.MedlineCitation.Article.AuthorList;
  if (alist.length == 1) { refFields.shortAuthors = refFields.firstAuthor; }
    else if (alist.length == 2) { refFields.shortAuthors = refFields.firstAuthor + " and " + alist[1].LastName; }
    else { refFields.shortAuthors = refFields.firstAuthor + " et al."; }
  refFields.authorList = refFields.firstAuthor + ", " + authorFirst(alist[0].Initials);
  if (alist.length > 0) { refFields.authorList += ", "; }
  for (var i=1; i<alist.length-1; i++) { refFields.authorList += authorFirst(alist[i].Initials) + " " + alist[i].LastName +", "; }
  refFields.lastAuthor = authorFirst(alist[alist.length-1].Initials) + " " + alist[alist.length-1].LastName;
  refFields.authorList += "and " + refFields.lastAuthor;
  refFields.fullCitation = refFields.authorList;
  if (alist.length > 0) { refFields.fullCitation += "."; }

  //process date
  refFields.pubDate = PMItem.MedlineCitation.Article.Journal.JournalIssue.PubDate.Year;
  refFields.refID = refFields.firstAuthor + refFields.pubDate;
  refFields.fullCitation += " " + refFields.pubDate + ". ";

  //process title
  refFields.articleTitle = PMItem.MedlineCitation.Article.ArticleTitle;
  refFields.fullCitation += refFields.articleTitle + " ";
  refFields.articleTitle = refFields.articleTitle.substr(0,refFields.articleTitle.length - 1);  //remove period

  //process journal info.
  refFields.journalTitle = journalCase(PMItem.MedlineCitation.Article.Journal.Title);
  refFields.journalAbbr = PMItem.MedlineCitation.Article.Journal.ISOAbbreviation;
  refFields.shortCitation = refFields.journalAbbr + " ";
  refFields.fullCitation += refFields.journalAbbr + " ";
  refFields.volume = PMItem.MedlineCitation.Article.Journal.JournalIssue.Volume;
  refFields.shortCitation += refFields.volume + ":";
  refFields.fullCitation += refFields.volume + ":";
  refFields.issue = PMItem.MedlineCitation.Article.Journal.JournalIssue.Issue;
  refFields.pages = journalPages(PMItem.MedlineCitation.Article.Pagination.MedlinePgn);
  refFields.shortCitation += refFields.pages;
  refFields.fullCitation += refFields.pages + ".";

  //process abstract and misc article data
  if (PMItem.MedlineCitation.Article.Abstract) refFields.abstract = PMItem.MedlineCitation.Article.Abstract.AbstractText[0];
  refFields.pmid = PMItem.MedlineCitation.PMID;
  refFields.authorAddress = refFields.lastAuthor + " - " + PMItem.MedlineCitation.Article.Affiliation;
  refFields.type = "article";  
  var ptype = PMItem.MedlineCitation.Article.PublicationTypeList;
  for (var i=0; i<ptype.length; i++) { if (ptype[i] == "Review") { refFields.type = "review"; } }
  var ids = PMItem.PubmedData.ArticleIdList;
  refFields.doi = "";
  refFields.pmc = "";
  for (var i=0; i<ids.length; i++) {
    if ( ids[i].substr(0,3) == "PMC" ) { refFields.pmc = ids[i]; }
    else if ( ids[i].search(/[0-9]+\.[0-9]+\/[a-z,A-Z].*/) > -1 ) { refFields.doi = ids[i]; }
    }
  return refFields;
  };
//}}}

// // Function to get author initials from PubMed record in format J. E.
//{{{
function authorFirst(aname) {
  var temp = aname.split("");
  var aname = temp.join(". ") + ".";
  return aname;
  };
//}}}

// // Function to get full page numbers from PubMed record (e.g., 2016-2019)
//{{{
function journalPages(jpage) {
  var pages = jpage.split("-");
  if (pages.length > 1 && parseInt(pages[1]) < parseInt(pages[0])) { pages[1] = pages[0].substr(0,pages[0].length-pages[1].length) + pages[1]; }
  jpage = pages[0];
  if (pages[1]) { jpage += "-" + pages[1]; }
  return jpage;
  };
//}}}

// // Function to set reference tiddler fields from refFields object
//{{{
function setRefFields(refFields) {
  store.setValue(refFields.refID,"alist",refFields.authorList);
  store.setValue(refFields.refID,"sauthors",refFields.shortAuthors);
  store.setValue(refFields.refID,"year",refFields.pubDate);
  store.setValue(refFields.refID,"rtitle",refFields.articleTitle);
  store.setValue(refFields.refID,"fjournal",refFields.journalTitle);
  store.setValue(refFields.refID,"journal",refFields.journalAbbr);
  store.setValue(refFields.refID,"vol",refFields.volume);
  store.setValue(refFields.refID,"issue",refFields.issue);
  store.setValue(refFields.refID,"pages",refFields.pages);
  store.setValue(refFields.refID,"abstract",refFields.abstract);
  store.setValue(refFields.refID,"scite",refFields.shortCitation);
  store.setValue(refFields.refID,"pubtype",refFields.type);
  store.setValue(refFields.refID,"pmid", refFields.pmid);
  store.setValue(refFields.refID,"doi", refFields.doi);
  store.setValue(refFields.refID,"pmc",refFields.pmc);
  store.setValue(refFields.refID,"fcite",refFields.fullCitation);
  store.setValue(refFields.refID,"adr",refFields.authorAddress);
  if ( refFields.doi != "" ) { var jlink = "[[" + refFields.shortCitation + "|http://dx.doi.org/" + refFields.doi + "]]"; }
    else { var jlink = "[[" + refFields.shortCitation + "|http://pubget.com/paper/" + refFields.pmid + "]]"; }
  store.setValue(refFields.refID,"jlink",jlink);
  store.setValue(refFields.refID,"pm",1);
  store.setValue(refFields.refID,"ntid",refFields.refID+" Notes");
  store.setValue(refFields.refID,"ptid",refFields.refID+".pdf");
  return;
  };
//}}}

// // Macro to format reference data for view template use
//{{{
config.macros.refShow = {}
config.macros.refShow.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
  switch (params[0]) {
    case "pubtype":
      if ( tiddler.fields.pubtype == "review" ) { wikify("Review<br>",place); } else { return; }
      break;
    case "pmid":
      if ( tiddler.fields.pmid != "" ) { wikify("PMID: [["+tiddler.fields.pmid+"|http://www.ncbi.nlm.nih.gov/pubmed?term="+tiddler.fields.pmid+"]]",place); } else { return; }
      break;
    case "fjournal":
      wikify("''Full journal information'': " + tiddler.fields.fjournal + " " + tiddler.fields.vol + "(" + tiddler.fields.issue + "):" + tiddler.fields.pages + " (" + tiddler.fields.year + ")",place);
      break;
    case "pmc":
      if ( tiddler.fields.pmc != "" ) { wikify("''PubMed Central ID'': [[" + tiddler.fields.pmc + "|http://www.ncbi.nlm.nih.gov/sites/entrez?db=pmc&amp;cmd=search&amp;term="+tiddler.fields.pmc+"]]",place); } else { return; }
      break;
    case "doi":
      if ( tiddler.fields.doi != "" ) { wikify("''DOI'': [[" + tiddler.fields.doi + "|http://dx.doi.org/"+tiddler.fields.doi+"]]",place); } else { return; }
      break;
    case "pubget":
      if ( tiddler.fields.pmid != "" ) { wikify("''Pubget'': [[PMID " + tiddler.fields.pmid + "|http://pubget.com/paper/" + tiddler.fields.pmid + "]]",place); } else { return; }
      break;
    }
  };
//}}}

// // "More" and "less" macros to show/hide full reference
//{{{
config.macros.showMore = {
  label: "\u25BA more",
  prompt: "show full citation data",
  handler: function(place) { createTiddlyButton(place,this.label,this.prompt,this.onClick); },
  onClick: function(e) {
    jQuery(".showMore").hide();
    jQuery(".showLess").show();
    jQuery(".fullCite").show();
    }
  };
config.macros.showLess = {
  label: "\u25BC  less",
  prompt: "show compact citation data",
  handler: function(place) { createTiddlyButton(place,this.label,this.prompt,this.onClick); },
  onClick: function(e) {
    jQuery('.showMore').show();
    jQuery('.showLess').hide();
    jQuery('.fullCite').hide();
    }
  };
//}}}

// // Function to make a list of matching tiddlers
//{{{
function makeList(match,needle) {
  var listArray = [];
  var tids = store.getTaggedTiddlers("ref");
  for ( var i=0; i<tids.length; i++ ) {
    var haystack = store.getValue(tids[i].title,match);
    if ( flexMatch(needle,haystack,"and") ) { listArray.push(tids[i].title); }
    }
  return listArray;
  }
//}}}

// // Function to create a tiddler to show a list or the results of a search
//{{{
function showListResults(listTitle,listArray) {
  store.saveTiddler(listTitle,listTitle,"",config.options.txtUserName,new Date(),"list");
  store.setValue(listTitle,"list",listArray);
  story.displayTiddler(null,listTitle);
  }
//}}}

// // showList macro to display a list or search result in a "list" tiddler
//{{{
config.macros.showList = {
  label: "Show result list",
  handler: function (place) {
        var table = jQuery("<table class='listtable' />");
        jQuery("<thead />").
        append("<td>Author</td>").
        append("<td>Date</td>").
        append("<td>Title</td>").
        append("<td>&nbsp;</td>").
        append("<td>&nbsp;</td>").
        appendTo(table);
        var tidList = tiddler.fields.list;
        if ( tidList != undefined && tidList != "") {
          var tiddlers = [];
          var listArray = tidList.split(",");
          for ( var i=0; i<listArray.length; i++ ) { tiddlers.push(store.getTiddler(listArray[i])); }
          }
        else { var tiddlers = store.getTaggedTiddlers("ref"); }
        for ( var i=0; i<tiddlers.length; i++ ) {
          var tid = tiddlers[i];
          var year = tid.fields.year;
          var rtitle = tid.fields.rtitle;
          var link = createTiddlyLink(null,tid.title,true);
          link.innerHTML = tid.fields.sauthors;
          var row = jQuery("<tr />").appendTo(table);
          jQuery("<td />").append(link).appendTo(row);
          jQuery("<td />").append(year).appendTo(row);
          jQuery("<td />").addClass("noRight").append(rtitle).appendTo(row);
          var note="";
          var pdf="";
          if ( store.tiddlerExists(tid.fields.ntid) ) {
            note = createTiddlyLink(null,tid.fields.ntid,true);
            note.innerHTML = "<img src='icons/clip.png' />";
            }
          if ( store.tiddlerExists(tid.fields.ptid) ) {
            pdf = createTiddlyLink(null,tid.fields.ptid,true);
            pdf.innerHTML = "<img src='icons/spdf.png' />";
            }
          else if ( tid.fields.paper ) { pdf = "<img src='icons/plaindoc.png'>"; }
          jQuery("<td />").addClass("iconCell").append(note).appendTo(row);
          jQuery("<td />").addClass("iconCell").append(pdf).appendTo(row);
          }
        table.appendTo(place);
        jQuery('#filterButton').click(function() {
          filter(jQuery('#filter').val());
          });
        jQuery('#filter').keypress(function(typeIn) {
          if (typeIn.keyCode==13) { typeIn.preventDefault(); filter(jQuery('#filter').val()); }
          });
        jQuery('form.filterForm input[name="limReviews"]').click(function() {
          if ( this.checked ) {
            jQuery("tbody tr td:first-child a").each(function() {  
              var theRef = this.title.substr(0,this.title.indexOf(" "));
              if ( store.getTiddler(theRef).fields.pubtype != "review" ) { jQuery(this.parentNode.parentNode).hide(); }
              });
            }
          else {
            jQuery("tbody tr").show();
            }
          });
    }
  }
//}}}

// // Macro orderArticle: Create an I.L.L. form for an article based on PMID
//{{{
config.macros.orderArticle = {
  label: "Order article",
  prompt: "Order article via interlibrary loan"
  };

config.macros.orderArticle.handler = function(place) { createTiddlyButton(place,this.label,this.prompt,this.onClick); };

config.macros.orderArticle.onClick = function(e) {
    if (!e) var e = window.event;
    var where = place;
    var PMID = prompt("Enter PubMed PMID or blank for manual data entry", "");
    if ( !(PMID == null || PMID == undefined || PMID == "") ) { config.macros.orderArticle.getData(PMID,where) }
    else { config.macros.orderArticle.makePanel(where) }
    e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();
    };

config.macros.orderArticle.makePanel = function(where,pData) {
  clearMessage()
  var panel = createTiddlyElement(where,"span","orderPanel","orderPanel",null);
  var html = store.getTiddler("OrderForm").text;
  panel.innerHTML=html;
  if ( pData ) {
    jQuery("#a_title").val(pData.Title);
    var atemp = pData.AuthorList;
    var alist = atemp[0].substr(0,atemp[0].indexOf(" "));
    if ( atemp.length == 2 ) { alist += " and " + atemp[1].substr(0,atemp[1].indexOf(" ")); }
    if ( atemp.length >= 3 ) { alist += " et al."; }
    jQuery("#a_author").val(alist);
    jQuery("#p_title").val(pData.FullJournalName);
    jQuery("#a_date").val(pData.PubDate.substr(0,4));
    jQuery("#p_volume").val(pData.Volume);
    jQuery("#p_number").val(pData.Issue);
    jQuery("#a_pages").val(pData.Pages);
    jQuery("#a_source").html("PubMed: PMID " + pData.ArticleIds.pubmed);
    }
  jQuery("#orderPanel input[value='Cancel']").click(function() { jQuery("#orderPanel").remove(); });
  //jQuery("#orderPanel input[value='Send Request']").click(function() { jQuery("#illForm").submit(); jQuery("#orderPanel").remove(); });
  jQuery("#orderPanel").show();
  jQuery("#p_title").focus();
  };

config.macros.orderArticle.getData = function(pmid,where) {
  displayMessage('Fetching from PubMed...');
  var args  = { 'apikey' : 'ac329f4b439fbca0d2e61cdd90a40509',
	            'db' : 'pubmed',
	            'term' : pmid,
                    'retmax' : 1,    // maximum number of results from Esearch
                    'max' : 1,        // maximum number of results passed to Esummary
                    'start'  : 0
                    };
  jQuery.getJSON('http://entrezajax.appspot.com/esearch+esummary?callback=?', args, function(data) {
    if(data.entrezajax.error == true) {
      alert("EntrezAjax failed with error " + data.entrezajax.error_message);
      return;
      }
    if(data.entrezajax.count == 0) {
      alert("No records returned for PMID " + pmid);
      return;
    }
    jQuery.each(data.result, function(i, PMItem) {
      config.macros.orderArticle.makePanel(where,PMItem)
      });
    });
  };
//}}}


/***
|''Name:''|ReferencesPlugin|
|''Description:''|Create automated tiddler reference footnotes.|
|''Source:''|Modified from FootnotesPlugin: http://tw.lewcid.org/#FootnotesPlugin|
|''~CoreVersion:''|2.2.2|

!!Usage:
*To create a footnote, just put the footnote text inside triple #'s.
*Footnotes are numbered automatically, and listed at the bottom of the tiddler.
***/

// // Code to create reference footnote/link using formatter (modified from tw.lewcid.org)
//{{{
config.referencesPlugin = {
	backLabel: "\u25B2",
	prompt:"show reference"
};

config.formatters.unshift( {
    name: "references",
    match: "###",
    lookaheadRegExp: /###((?:.|\n)*?)###/g,
    handler: function(w)
    {
        this.lookaheadRegExp.lastIndex = w.matchStart;
        var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
        if(lookaheadMatch && lookaheadMatch.index == w.matchStart )
            {
			var tiddler = story.findContainingTiddler(w.output);
			if (!tiddler.refs)
				tiddler.refs = [];
			var title = tiddler.getAttribute("tiddler");
                        var refArray = lookaheadMatch[1].split(",");
                        for ( var k=0; k<refArray.length; k++ ) {
			  tiddler.refs.pushUnique(refArray[k]);
                          var pos = tiddler.refs.indexOf(refArray[k]) + 1;
                          createTiddlyButton(w.output,pos,config.referencesPlugin.prompt,function() {
                            document.getElementById(title+"refholder").scrollIntoView();
                            return false;
                            },"reflink",title+"reflink"+pos);
                          }
                        w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
            }
    }
});

old_references_refreshTiddler = Story.prototype.refreshTiddler;
Story.prototype.refreshTiddler = function(title,template,force)
{
    var tiddler = old_references_refreshTiddler.apply(this,arguments);
	if (tiddler.refs && tiddler.refs.length)
	{
		var holder = createTiddlyElement(null,"div",null,"refholder","");
                var rimg = createTiddlyElement(holder,"img",null,"rimg","");
                var ntxt = createTiddlyText(holder,"References");
                rimg.src = "icons/refIcon.png";
		var list = createTiddlyElement(holder,"ol",title+"refholder","reflist");
		for (var i=0; i<tiddler.refs.length; i++)
		{
			var ref = createTiddlyElement(list,"li",title+"ref"+(i+1),"reference");
                        var rtxt = tiddler.refs[i].replace(/([0-9]{4})/," $1");
                        var refslider = "+++(refc)*{{rftxt{[" + rtxt+ "]}}}..." + store.getTiddlerSlice("Refs",tiddler.refs[i]) + "===";
			wikify(refslider +" ",ref);
			createTiddlyButton(ref,config.referencesPlugin.backLabel,"back",function(){window.scrollTo(0,ensureVisible(document.getElementById(this.parentNode.id.replace("ref","reflink"))));return false;},"refbklink");
		}
		var count = tiddler.childNodes.length;
		for (var j=0; j<count; j++){
			if(hasClass(tiddler.childNodes[j],"viewer")){
				var viewer = tiddler.childNodes[j];	
			}
		}
		viewer.appendChild(holder);
		tiddler.refs = [];
	}
    return tiddler;
};
//}}}

// // Code to look for references in this tw and extract citation/pdf information from the refs tw (some pieces from TiddlyTools LoadTiddlersPlugin)
//{{{
config.macros.refList = {
  label: "Scan refs",
  prompt: "Scan for references and extract matching citations from refs tw",
  handler: function(place) { createTiddlyButton(place,this.label,this.prompt,this.onClick); },
  onClick: function(e) { config.macros.refList.scanStart(); },
  scanStart: function() {

    // find reference formatter in tiddlers of this tw, make unique array of needed references
    var tids = store.getTiddlers('title','systemConfig');
    var re = /#{3}(.+?)#{3}/g
    var refArray = [];
    for ( var i=0; i<tids.length; i++ ) {
      while ( rArray = re.exec(tids[i].text) ) { 
        if ( rArray[1].indexOf(",") > -1 ) {
          smArray = rArray[1].split(",");
          for ( var j=0; j<smArray.length; j++ ) { refArray.push(smArray[j]); }
          }
        else { refArray.push(rArray[1]); }
        }
      }
    refArray = getUniqueArray(refArray).sort();

    // open refs tw and load its store to variable remoteStore
    var pathPrefix=document.location.href;
    var slashpos=pathPrefix.lastIndexOf('/'); if (slashpos==-1) slashpos=pathPrefix.lastIndexOf('\\'); 
    if (slashpos!=-1 && slashpos!=pathPrefix.length-1) pathPrefix=pathPrefix.substr(0,slashpos+1);
    var src=pathPrefix+"refs.htm";
    if (pathPrefix.substr(0,5)!='http:') src=getLocalPath(src);
    var txt=loadFile(src);
    var remoteStore=new TiddlyWiki();
    remoteStore.importTiddlyWiki(txt);

    // get citation and pdf information for references in array, create table in tiddler Refs
    var wText = "";
    for ( var i=0; i<refArray.length; i++ ) {
      wText += "|" + refArray[i] + "|";
      var cite = remoteStore.getValue(refArray[i],"alist");
      if ( cite != undefined ) { 
        wText += cite + ". " + remoteStore.getValue(refArray[i],"year") + ". " + remoteStore.getValue(refArray[i],"rtitle") + ". ";
        var ptid = refArray[i] + ".pdf"
        var pdf = "";
        if ( remoteStore.tiddlerExists(ptid) ) {
          var ptxt = remoteStore.getTiddlerText(ptid);
          var match = /!url\n(.*?)\n/.exec(ptxt);
          var urlSec = match[1];
          if ( urlSec && urlSec != "" ) { pdf = urlSec; }
          else {
            match = /!pubget\n(.*?)\n/.exec(ptxt);
            var pubSec = match[1];
            if ( pubSec && pubSec != "" ) { pdf = pubSec; }
            }
          }
        if ( pdf != "" ) { wText += "[[" + remoteStore.getValue(refArray[i],"scite") + "|" + pdf + "]]."; }
          else { wText += remoteStore.getValue(refArray[i],"scite") + "."; }
        }
      wText += "|\n";
      }
    store.setValue("Refs","text",wText);
    story.forEachTiddler(function(t,e) { story.refreshTiddler(t,null,true) });
    refreshDisplay(); 
    story.displayTiddler(null,"Refs");
    }
  };
//}}}
<script label="refresh" title="redisplay the contents of this
tiddler">
story.refreshTiddler(story.findContainingTiddler(place).getAttribute("tiddler"),null,true);
</script> 
|Ackermann2003|Ackermann, M., S. C. Stearns, and U. Jenal. 2003. Senescence in a bacterium with asymmetric division. [[Science 300:1920|http://www.sciencemag.org/content/300/5627/1920.full.pdf]].|
|Amici1989|Amici, A., R. L. Levine, L. Tsai, and E. R. Stadtman. 1989. Conversion of amino acid residues in proteins and amino acid homopolymers to carbonyl derivatives by metal-catalyzed oxidation reactions. [[J. Biol. Chem. 264:3341-3346|http://www.jbc.org/content/264/6/3341.long]].|
|Aswad1994|Aswad, D. W.. 1994. Purification and properties of protein l-isoaspartyl methyltransferase. Deamidation and Isoaspartate Formation in Peptides and Proteins, pp. 32-46.|
|Baranyi1994|Baranyi, J., and T. A. Roberts. 1994. A dynamic approach to predicting bacterial growth in food. Int. J. Food Microbiol. 23:277-294.|
|Barber1983|Barber, J. R., and S. Clarke. 1983. Membrane protein carboxyl methylation increases with human erythrocyte age. Evidence for an increase in the number of methylatable sites. [[J. Biol. Chem. 258:1189-1196|http://www.jbc.org/content/258/2/1189.long]].|
|Ben-Zvi2001|Ben-Zvi, A. P., and P. Goloubinoff. 2001. Review: mechanisms of disaggregation and refolding of stable protein aggregates by molecular chaperones. J. Struct. Biol. 135:84-93.|
|Benson2007|Benson, D. A., I. Karsch-Mizrachi, D. J. Lipman, J. Ostell, and D. L. Wheeler. 2007. GenBank. [[Nucleic Acids Res. 35:D21-5|http://nar.oxfordjournals.org/content/35/suppl_1/D21.full.pdf]].|
|Berlett1997|Berlett, B. S., and E. R. Stadtman. 1997. Protein oxidation in aging, disease, and oxidative stress. [[J. Biol. Chem. 272:20313-20316|http://www.jbc.org/content/272/33/20313.full.pdf]].|
|Bjedov2003|Bjedov, I., O. Tenaillon, B. Gérard, V. Souza, E. Denamur, M. Radman, F. Taddei, and I. Matic. 2003. Stress-induced mutagenesis in bacteria. [[Science 300:1404-1409|http://www.sciencemag.org/content/300/5624/1404.full.pdf]].|
|Blankenhorn1999|Blankenhorn, D., J. Phillips, and J. L. Slonczewski. 1999. Acid- and base-induced proteins during aerobic and anaerobic growth of Escherichia coli revealed by two-dimensional gel electrophoresis. [[J. Bacteriol. 181:2209-2216|http://jb.asm.org/cgi/reprint/181/7/2209]].|
|Bree2002|Bree, R. T., C. Stenson-Cox, M. Grealy, L. Byrnes, A. M. Gorman, and A. Samali. 2002. Cellular longevity: role of apoptosis and replicative senescence. Biogerontology 3:195-206.|
|Brennan1994|Brennan, T. V., J. W. Anderson, Z. Jia, E. B. Waygood, and S. Clarke. 1994. Repair of spontaneously deamidated HPr phosphocarrier protein catalyzed by the L-isoaspartate-(D-aspartate) O-methyltransferase. [[J. Biol. Chem. 269:24586-24595|http://www.jbc.org/content/269/40/24586.long]].|
|Bukau1990|Bukau, B., and G. C. Walker. 1990. Mutations altering heat shock specific subunit of RNA polymerase suppress major cellular defects of E. coli mutants lacking the DnaK chaperone. [[EMBO J. 9:4027-4036|http://www.ncbi.nlm.nih.gov/pmc/articles/PMC552175/pdf/emboj00239-0223.pdf]].|
|Bukau1998|Bukau, B., and A. L. Horwich. 1998. The Hsp70 and Hsp60 chaperone machines. [[Cell 92:351-366|http://www.sciencedirect.com/science?_ob=MImg&_imagekey=B6WSN-419K592-7-1&_cdi=7051&_user=2389059&_pii=S0092867400809289&_origin=gateway&_coverDate=02%2F06%2F1998&_sk=999079996&view=c&wchp=dGLzVzz-zSkzk&md5=9e8cf35bd7803f43fc46453df4c95b20&ie=/sdarticle.pdf]].|
|Buss1997|Buss, H., T. P. Chan, K. B. Sluis, N. M. Domigan, and C. C. Winterbourn. 1997. Protein carbonyl measurement by a sensitive ELISA method. Free Radic. Biol. Med. 23:361-366.|
|Calvin1988|Calvin, N. M., and P. C. Hanawalt. 1988. High-efficiency transformation of bacterial cells by electroporation. [[J. Bacteriol. 170:2796-2801|http://jb.asm.org/cgi/reprint/170/6/2796]].|
|Capasso1996|Capasso, S., A. Di Donato, L. Esposito, F. Sica, G. Sorrentino, L. Vitagliano, A. Zagari, and L. Mazzarella. 1996. Deamidation in proteins: the crystal structure of bovine pancreatic ribonuclease with an isoaspartyl residue at position 67. J. Mol. Biol. 257:492-496.|
|Carlioz1986|Carlioz, A., and D. Touati. 1986. Isolation of superoxide dismutase mutants in Escherichia coli: is superoxide dismutase necessary for aerobic life. [[EMBO J. 5:623-630|http://www.ncbi.nlm.nih.gov/pmc/articles/PMC1166808/pdf/emboj00166-0180.pdf]].|
|Carlson2000|Carlson, A. D., and R. M. Riggin. 2000. Development of improved high-performance liquid chromatography conditions for nonisotopic detection of isoaspartic acid to determine the extent of protein deamidation. Anal. Biochem. 278:150-155.|
|Chavous2001|Chavous, D. A., F. R. Jackson, and C. M. O'Connor. 2001. Extension of the Drosophila lifespan by overexpression of a protein repair methyltransferase. [[Proc. Natl. Acad. Sci. U.S.A. 98:14814-14818|http://www.pnas.org/content/98/26/14814.full.pdf]].|
|Cirrito2001|Cirrito, T. P., Z. Pu, M. B. Deck, and E. R. Unanue. 2001. Deamidation of asparagine in a major histocompatibility complex-bound peptide affects T cell recognition but does not explain type B reactivity. [[J. Exp. Med. 194:1165-1170|http://jem.rupress.org/content/194/8/1165.full.pdf]].|
|Clarke1992|Clarke, S., and S. Clarke. 1992. Protein isoprenylation and methylation at carboxyl-terminal cysteine residues. [[Annu. Rev. Biochem. 61:355-386|http://www.annualreviews.org/doi/pdf/10.1146/annurev.bi.61.070192.002035]].|
|Clarke1992b|Clarke, S., R. C. Stephenson, and J. D. Lowenson. 1992. Lability of asparagine and aspartic acid residues in proteins and peptides: spontaneous deamidation and isomerization reactions. Stability of Protein Pharmaceuticals, Part A: Chemical and Physical Pathways of Protein Degradation, pp. 1-29.|
|Clarke2003|Clarke, S., and S. Clarke. 2003. Aging as war between chemical and biochemical processes: protein methylation and the recognition of age-damaged proteins for repair. [[Ageing Res. Rev. 2:263-285|http://www.sciencedirect.com/science?_ob=MImg&_imagekey=B6X1H-489YMS7-2-R&_cdi=7243&_user=2389059&_pii=S1568163703000114&_origin=gateway&_coverDate=07%2F31%2F2003&_sk=999979996&view=c&wchp=dGLbVzW-zSkWb&md5=ee3994cbc5e3e49275bf4da66f69635e&ie=/sdarticle.pdf]].|
|Dalle-Donne2003||
|David1997|David, C. L., C. L. Szumlanski, C. G. DeVry, J. O. Park-Hah, S. Clarke, R. M. Weinshilboum, and D. W. Aswad. 1997. Human erythrocyte protein L-isoaspartyl methyltransferase: heritability of basal activity and genetic polymorphism for thermal stability. Arch. Biochem. Biophys. 346:277-286.|
|David1999|David, C. L., V. A. Pierce, D. W. Aswad, and A. G. Gibbs. 1999. The effect of urea exposure on isoaspartyl content and protein L-isoaspartate methyltransferase activity in Drosophila melanogaster. Comp. Biochem. Physiol. B, Biochem. Mol. Biol. 124:423-427.|
|Davies1987|Davies, K. J., and M. E. Delsignore. 1987. Protein damage and degradation by oxygen radicals. III. Modification of secondary and tertiary structure. [[J. Biol. Chem. 262:9908-9913|http://www.jbc.org/content/262/20/9908.long]].|
|Davies1998||
|Davies2000||
|DeVry1999|DeVry, C. G., and S. Clarke. 1999. Polymorphic forms of the protein L-isoaspartate (D-aspartate) O-methyltransferase involved in the repair of age-damaged proteins. [[J. Hum. Genet. 44:275-288|http://www.nature.com/jhg/journal/v44/n5/pdf/jhg199966a.pdf]].|
|Dhar2007||
|DiDonato1993||
|Diamant2001||
|Diederich1992||
|Doyle2003||
|Dukan1998|Dukan, S., and T. Nyström. 1998. Bacterial senescence: stasis results in increased and differential oxidation of cytoplasmic proteins leading to developmental induction of the heat shock regulon. [[Genes Dev. 12:3431-3441|http://genesdev.cshlp.org/content/12/21/3431.full.pdf]].|
|Dukan1999|Dukan, S., and T. Nyström. 1999. Oxidative stress defense and deterioration of growth-arrested Escherichia coli cells. [[J. Biol. Chem. 274:26027-26032|http://www.jbc.org/content/274/37/26027.full.pdf]].|
|Fanelus2008||
|Farrar2002|Farrar, C., and S. Clarke. 2002. Altered levels of S-adenosylmethionine and S-adenosylhomocysteine in the brains of L-isoaspartyl (D-Aspartyl) O-methyltransferase-deficient mice. [[J. Biol. Chem. 277:27856-27863|http://www.jbc.org/content/277/31/27856.full.pdf]].|
|Farrar2005|Farrar, C., C. R. Houser, and S. Clarke. 2005. Activation of the PI3K/Akt signal transduction pathway and increased levels of insulin receptor in protein repair-deficient mice. [[Aging Cell 4:1-12|http://onlinelibrary.wiley.com/doi/10.1111/j.1474-9728.2004.00136.x/pdf]].|
|Farrar2005a||
|Finch2001|Finch, C. E., and G. Ruvkun. 2001. The genetics of aging. [[Annu Rev Genomics Hum Genet 2:435-462|http://www.annualreviews.org/doi/pdf/10.1146/annurev.genom.2.1.435]].|
|Finkel1999|Finkel, S. E., and R. Kolter. 1999. Evolution of microbial diversity during prolonged starvation. [[Proc. Natl. Acad. Sci. U.S.A. 96:4023-4027|http://www.pnas.org/content/96/7/4023.full.pdf]].|
|Finkel2006|Finkel, S. E., and S. E. Finkel. 2006. Long-term survival during stationary phase: evolution and the GASP phenotype. [[Nat. Rev. Microbiol. 4:113-120|http://pubget.com/paper/16415927]].|
|Fu1991|Fu, J. C., L. Ding, and S. Clarke. 1991. Purification, gene cloning, and sequence analysis of an L-isoaspartyl protein carboxyl methyltransferase from Escherichia coli. [[J. Biol. Chem. 266:14562-14572|http://www.jbc.org/content/266/22/14562.long]].|
|Galletti1995|Galletti, P., D. Ingrosso, C. Manna, G. Clemente, and V. Zappia. 1995. Protein damage and methylation-mediated repair in the erythrocyte. [[Biochem. J. 306 ( Pt 2):313-325|http://pubget.com/paper/7887885]].|
|Geiger1987|Geiger, T., and S. Clarke. 1987. Deamidation, isomerization, and racemization at asparaginyl and aspartyl residues in peptides. Succinimide-linked reactions that contribute to protein degradation. [[J. Biol. Chem. 262:785-794|http://www.jbc.org/content/262/2/785.long]].|
|Gerdes2003||
|Glover1998||
|Gonzalez-Flecha1995||
|Griffith2002||
|Gur2004||
|Guzman1995|Guzman, L. M., D. Belin, M. J. Carson, and J. Beckwith. 1995. Tight regulation, modulation, and high-level expression by vectors containing the arabinose PBAD promoter. [[J. Bacteriol. 177:4121-4130|http://www.ncbi.nlm.nih.gov/pmc/articles/PMC177145/pdf/1774121.pdf]].|
|Göthel1999||
|Hansen2008||
|Hassan1979||
|Hicks2005|Hicks, W. M., M. V. Kotlajich, and J. E. Visick. 2005. Recovery from long-term stationary phase and stress survival in Escherichia coli require the L-isoaspartyl protein carboxyl methyltransferase at alkaline pH. [[Microbiology (Reading, Engl.) 151:2151-2158|http://pubget.com/paper/16000706]].|
|Holmes1981||
|Huebscher1999||
|Ingrosso1995||
|Jayarman2008||
|Johnson1999||
|Kagan1997|Kagan, R. M., H. J. McFadden, P. N. McFadden, C. O'Connor, and S. Clarke. 1997. Molecular phylogenetics of a protein repair methyltransferase. Comp. Biochem. Physiol. B, Biochem. Mol. Biol. 117:379-385.|
|Kagan1997a|Kagan, R. M., A. Niewmierzycka, and S. Clarke. 1997. Targeted gene disruption of the Caenorhabditis elegans L-isoaspartyl protein repair methyltransferase impairs survival of dauer stage nematodes. Arch. Biochem. Biophys. 348:320-328.|
|Kagan1997b||
|Kandror2002||
|Kern2005|Kern, R., A. Malki, J. Abdallah, J. C. Liebart, C. Dubucs, M. H. Yu, and G. Richarme. 2005. Protein isoaspartate methyltransferase is a multicopy suppressor of protein aggregation in Escherichia coli. [[J. Bacteriol. 187:1377-1383|http://jb.asm.org/cgi/reprint/187/4/1377]].|
|Kim1997|Kim, E., J. D. Lowenson, D. C. MacLaren, S. Clarke, and S. G. Young. 1997. Deficiency of a protein-repair enzyme results in the accumulation of altered proteins, retardation of growth, and fatal seizures in mice. [[Proc. Natl. Acad. Sci. U.S.A. 94:6132-6137|http://www.pnas.org/content/94/12/6132.full.pdf]].|
|Kolodkin-Gal2007||
|Kolodkin-Gal2008||
|Kolter1993||
|LaPointe2005||
|Lanthier2002||
|Lanthier2004||
|Lapointe2005||
|Lee2001|Lee, J. Y., J. E. Kwak, J. Moon, S. H. Eom, E. C. Liong, J. D. Pedelacq, J. Berendzen, and S. W. Suh. 2001. Crystal structure and functional analysis of the SurE protein identify a novel phosphatase family. [[Nat. Struct. Biol. 8:789-794|http://www.nature.com/nsmb/journal/v8/n9/pdf/nsb0901-789.pdf]].|
|Lee2005|Lee, C., and M. H. Yu. 2005. Protein folding and diseases. [[J. Biochem. Mol. Biol. 38:275-280|http://www.jbmb.or.kr/jbmb/pdf.php?data=MTEwNDEzMTVAcGRmX3JhaW50cmFjZV9sZWV5c0AlNUIzOC0zJTVEMDUwNTMxMTgxOV8yNzUucGRm]].|
|Leslie2003||
|Levine2001||
|Lewis2010|Lewis, K., and K. Lewis. 2010. Persister cells. [[Annu. Rev. Microbiol. 64:357-372|http://www.annualreviews.org/doi/pdf/10.1146/annurev.micro.112408.134306]].|
|Linton2001||
|Loewen1984||
|Lowenson1994|Lowenson, J. D., and S. Clarke. 1994. Recognition of isomerized and racemized aspartyl residues in peptides by the protein L-isoaspartate (D-aspartate) O-methyltransferase. Deamidation and Isoaspartate Formation in Peptides and Proteins, pp. 47-64.|
|Lowry1951||
|Mamula1999||
|Marchuk1991||
|McFadden1987|McFadden, P. N., and S. Clarke. 1987. Conversion of isoaspartyl peptides to normal peptides: implications for the cellular repair of damaged proteins. [[Proc. Natl. Acad. Sci. U.S.A. 84:2595-2599|http://www.pnas.org/content/84/9/2595.long...]].|
|Michelsen1995||
|Miller1972||
|Miller1978|Miller, C. G., and G. Schwartz. 1978. Peptidase-deficient mutants of Escherichia coli. [[J. Bacteriol. 135:603-611|http://jb.asm.org/cgi/reprint/135/2/603]].|
|Mogk1999|Mogk, A., T. Tomoyasu, P. Goloubinoff, S. Rüdiger, D. Röder, H. Langen, and B. Bukau. 1999. Identification of thermolabile Escherichia coli proteins: prevention and reversion of aggregation by DnaK and ClpB. [[EMBO J. 18:6934-6949|http://www.nature.com/emboj/journal/v18/n24/pdf/7592095a.pdf]].|
|Moskovitz1995|Moskovitz, J., M. A. Rahman, J. Strassman, S. O. Yancey, S. R. Kushner, N. Brot, and H. Weissbach. 1995. Escherichia coli peptide methionine sulfoxide reductase gene: regulation of expression and role in protecting against oxidative damage. [[J. Bacteriol. 177:502-507|http://jb.asm.org/cgi/reprint/177/3/502]].|
|Mudgett1993|Mudgett, M. B., and S. Clarke. 1993. Characterization of plant L-isoaspartyl methyltransferases that may be involved in seed survival: purification, cloning, and sequence analysis of the wheat germ enzyme. [[Biochemistry 32:11100-11111|http://pubget.com/paper/8198620]].|
|Mudgett1994|Mudgett, M. B., and S. Clarke. 1994. Hormonal and environmental responsiveness of a developmentally regulated protein repair L-isoaspartyl methyltransferase in wheat. [[J. Biol. Chem. 269:25605-25612|http://www.jbc.org/content/269/41/25605.long]].|
|Mudgett1996|Mudgett, M. B., and S. Clarke. 1996. A distinctly regulated protein repair L-isoaspartylmethyltransferase from Arabidopsis thaliana. Plant Mol. Biol. 30:723-737.|
|Murakami2008||
|Najbauer1996|Najbauer, J., J. Orpiszewski, and D. W. Aswad. 1996. Molecular aging of tubulin: accumulation of isoaspartyl sites in vitro and in vivo. [[Biochemistry 35:5183-5190|http://pubs.acs.org/doi/pdf/10.1021/bi953063g]].|
|Nguyen1989||
|Nyström1999||
|Nyström2002||
|Nyström2002a||
|Nyström2003||
|Parsell1993||
|Perna1997||
|Polyakova2005||
|Reeve1984||
|Reissner2006|Reissner, K. J., M. V. Paranandi, T. M. Luc, H. A. Doyle, M. J. Mamula, J. D. Lowenson, and D. W. Aswad. 2006. Synapsin I is a major endogenous substrate for protein L-isoaspartyl methyltransferase in mammalian brain. [[J. Biol. Chem. 281:8389-8398|http://www.jbc.org/content/281/13/8389.full.pdf]].|
|Ryazanov2002|Ryazanov, A. G., and B. S. Nefsky. 2002. Protein turnover plays a key role in aging. Mech. Ageing Dev. 123:207-213.|
|Schurter2000||
|Schweder1996||
|Seaver2001||
|Shacter2000||
|Sherman1992||
|Shi2007||
|Siegele1992|Siegele, D. A., and R. Kolter. 1992. Life after log. [[J. Bacteriol. 174:345-348|http://jb.asm.org/cgi/reprint/174/2/345?view=long&pmid=1729229]].|
|Siegele1993||
|Silhavy1984||
|Skorupski1996||
|Soti2002|Soti, C., and P. Csermely. 2002. Chaperones come of age. [[Cell Stress Chaperones 7:186-190|http://www.ncbi.nlm.nih.gov/pmc/articles/PMC514816/pdf/i1466-1268-7-2-186.pdf]].|
|Squier2001|Squier, T. C., and T. C. Squier. 2001. Oxidative stress and protein aggregation during biological aging. Exp. Gerontol. 36:1539-1550.|
|Squires1991||
|Stadtman2002||
|Stewart2005|Stewart, E. J., R. Madden, G. Paul, and F. Taddei. 2005. Aging and death in an organism that reproduces by morphologically symmetric division. [[PLoS Biol. 3:e45|http://www.plosbiology.org/article/fetchObjectAttachment.action?uri=info%3Adoi%2F10.1371%2Fjournal.pbio.0030045&representation=PDF]].|
|Stidham2003||
|Styrvold1986||
|Thomas2000||
|Tilly1991||
|Visalli1993||
|Visick1995|Visick, J. E., and S. Clarke. 1995. Repair, refold, recycle: how bacteria can deal with spontaneous and environmental damage to proteins. [[Mol. Microbiol. 16:835-845|http://pubget.com/paper/7476182]].|
|Visick1998|Visick, J. E., H. Cai, and S. Clarke. 1998. The L-isoaspartyl protein repair methyltransferase enhances survival of aging Escherichia coli subjected to secondary environmental stresses. [[J. Bacteriol. 180:2623-2629|http://jb.asm.org/cgi/reprint/180/10/2623]].|
|Visick1998a|Visick, J. E., J. K. Ichikawa, and S. Clarke. 1998. Mutations in the Escherichia coli surE gene increase isoaspartyl accumulation in a strain lacking the pcm repair methyltransferase but suppress stress-survival phenotypes. [[FEMS Microbiol. Lett. 167:19-25|http://pubget.com/paper/9785447]].|
|Wagner2007||
|Wang2001|Wang, J., and M. F. Wilkinson. 2001. Deletion mutagenesis of large (12-kb) plasmids by a one-step PCR protocol. BioTechniques 31:722-724.|
|Wang2006|Wang, T., H. Zhu, X. Ma, Z. Fei, Y. Ma, and D. Wei. 2006. Enhancing enzymatic activity of penicillin G acylase by coexpressing pcm gene. Appl. Microbiol. Biotechnol. 72:953-958.|
|Wigley2001||
|Winterbourn1999||
|Yang2006||
|Ymer1991||
|Young2001|Young, A. L., W. G. Carter, H. A. Doyle, M. J. Mamula, and D. W. Aswad. 2001. Structural integrity of histone H2B in vivo requires the activity of protein L-isoaspartate O-methyltransferase, a putative protein repair enzyme. [[J. Biol. Chem. 276:37161-37165|http://www.jbc.org/content/276/40/37161.full.pdf]].|
|Zambrano1996|Zambrano, M. M., and R. Kolter. 1996. GASPing for life in stationary phase. [[Cell 86:181-184|http://www.sciencedirect.com/science?_ob=MImg&_imagekey=B6WSN-4195BWM-3-G&_cdi=7051&_user=2389059&_pii=S0092867400800896&_origin=gateway&_coverDate=07%2F26%2F1996&_sk=999139997&view=c&wchp=dGLbVlz-zSkzk&md5=2d5ccffcd4dd20e4fb9ee9eae7ca3135&ie=/sdarticle.pdf]].|
|Zhu2005||
|Zhu2006|Zhu, H., R. J. Pan, T. W. Wang, Y. L. Shen, and D. Z. Wei. 2006. Functional solubilization of aggregation-prone TRAIL protein facilitated by coexpressing with protein isoaspartate methyltranferase. [[Appl. Microbiol. Biotechnol. 72:1033-1038|http://pubget.com/paper/16575568]].|
<<randomImage labPhotos left>>@@color:maroon;Our laboratory studies repair of damaged proteins by PCM, using the bacterium //E. coli// as a model to understand the effects of protein repair on aging@@. This page and the other pages in this topic will give you a general overview of what we do. Read the [[Scientific Background]] topic for a more detailed explanation.
!!Why do we Age?
One cause of aging is molecular damage: chemical changes that affect the function of the macromolecules that make up all of our cells: DNA, proteins, lipids and carbohydrates```The [[National Institute on Aging|http://www.nia.nih.gov]] publication "[[In Search of the Secrets of Aging|http://www.niapublications.org/pubs/secrets-of-aging/index.htm#content]]" provides a good overview of aging research for the general public.```###Finch2001###. Dysfunctional molecules can result from environmental factors such as [G[reactive oxygen species|ROS]][L[http://en.wikipedia.org/wiki/Reactive_oxygen_species]] ("free radicals") or simply from spontaneous chemical reactions.
!!Protein Damage
Any organism&mdash;be it bacterium, plant, fungus or human&mdash;can function properly only if thousands of different enzymes and other proteins in each of its cells are doing their jobs. For example, genetic diseases occur when mutations alter the functions of proteins. Proteins can also lose function due to molecular damage. Misfolded and otherwise damaged proteins have been implicated in aging and are also involved in Alzheimer's disease, autoimmune diseases, "mad cow" disease and even cancer###Lee2005###.

[0>i[wimages/isoasp.gif]]Our laboratory is interested in a particular form of protein damage: conversion of the normal amino acids [G[aspartate|asp]] (Asp) and [G[asparagine|asn]] (Asn) to an abnormal form, [[isoaspartate|Isoaspartate Formation]] ([G[isoAsp|isoasp]])###Clarke2003###. This happens spontaneously in the cells of all living things and can have a drastic effect on the activity of enzymes and other proteins.
!!Protein Repair
Some kinds of molecular damage can be detected and repaired by cellular enzymes. We are studying [G[PCM|pcm]], an enzyme that recognizes isoAsp sites in proteins and stimulates [[reconversion to Asp|Protein Repair by PCM]]###Clarke2003###. PCM is almost universal in living things and can restore the activity of damaged enzymes. Researchers working on bacteria, plants, nematodes, fruit flies and mice have shown that PCM is important for aging and/or long-term survival in each of these organisms. There is also evidence that the lack of PCM may be connected with epilepsy, autoimmunity, spina bifida, cancer and other disease conditions```see [[PCM vs Aging and Disease]] for more on the effects of isoaspartyl damage and repair on human disease.```
!!Aging //E. coli//?
[<I[//E. coli// (false color EM image)|wimages/coli.png]]Once thought to be essentially immortal, bacteria turn out to be [[good models|Aging in E. coli]] for some aspects of the aging process. Bacteria "age" when they are starved and can't make new proteins, a state called long-term [G[stationary phase|stat_phase]]. In the absence of PCM, //Escherichia coli// has a shorter "lifespan" when exposed to stressful conditions (heat, salt, paraquat, methanol).
!!Current Research
There is a lot that we don't know about how PCM works in a living cell. For example: Does it repair certain crucial proteins, or is it a "maintenance" enzyme for all proteins? Does PCM function in all cells at all times or in specific subpopulations? How does it interact with other protein repair and maintenance systems? How does isoaspartate affect protein function in the cell? We are currently investigating two main [[hypotheses|Current Hypotheses]]: that repair of isoAsp damage facilitates maintenance of protein folding and that PCM functions primarily in metabolically active subpopulations.

We anticipate that testing these two hypotheses will lead directly to better understanding of this key protein repair mechanism and indirectly to insights important to the study of significant degenerative [[diseases|PCM vs Aging and Disease]].
!!Learn More
*Follow the links in the Topics box above to learn more about PCM and protein repair
*Read the [[Scientific Background]] topic for a more in-depth understanding of our research
*See our [[Current Hypotheses]] and the [[Specific Aims]] of our current research
*Meet our [[Lab Members|Current Lab Members]], past and present
*Current research students can log in above to see projects, protocols, recipes, data and more.
!!Useful links
* [[E. coli genotypes|http://openwetware.org/wiki/E._coli_genotypes]]
* [[Open WetWare (protocols, etc.)|http://openwetware.org/wiki/Main_Page]]
* [[E. coli hub|http://www.ecolicommunity.org/]]

!!Suppliers
* [[G-Biosciences: UV and colorimetric assays for SAM-dependent methyltransferases|http://www.swiftpage2.com/SpeClicks.aspx?Acc=GBiosciences.Proteinman&SPCED=C081202210000&LNK=4&UId=676]]
|!Enzyme|!Recognition Sequence|
|AatII|GACGT/C|
|Acc65I|G/GTACC|
|AccI|GT/MKAC|
|AciI|CCGC(-3/-1)|
|AclI|AA/CGTT|
|AcuI|CTGAAG(16/14)|
|AfeI|AGC/GCT|
|AflII|C/TTAAG|
|AflIII|A/CRYGT|
|AgeI|A/CCGGT|
|AhdI|GACNNN/NNGTC|
|AleI|CACNN/NNGTG|
|AluI|AG/CT|
|AlwI|GGATC(4/5)|
|AlwNI|CAGNNN/CTG|
|ApaI|GGGCC/C|
|ApaLI|G/TGCAC|
|ApeKI|G/CWGC|
|ApoI|R/AATTY|
|AscI|GG/CGCGCC|
|AseI|AT/TAAT|
|AsiSI|GCGAT/CGC|
|AvaI|C/YCGRG|
|AvaII|G/GWCC|
|AvrII|C/CTAGG|
|BaeI|(10/15)ACNNNNGTAYC(12/7)|
|BamHI|G/GATCC|
|BanI|G/GYRCC|
|BanII|GRGCY/C|
|BbsI|GAAGAC(2/6)|
|BbvCI|CCTCAGC(-5/-2)|
|BbvI|GCAGC(8/12)|
|BccI|CCATC(4/5)|
|BceAI|ACGGC(12/14)|
|BcgI|(10/12)CGANNNNNNTGC(12/10)|
|BciVI|GTATCC(6/5)|
|BclI|T/GATCA|
|BfaI|C/TAG|
|BfuAI|ACCTGC(4/8)|
|BfuCI|/GATC|
|BglI|GCCNNNN/NGGC|
|BglII|A/GATCT|
|BlpI|GC/TNAGC|
|Bme1580I|GKGCM/C|
|BmgBI|CACGTC(-3/-3)|
|BmrI|ACTGGG(5/4)|
|BmtI|GCTAG/C|
|BpmI|CTGGAG(16/14)|
|Bpu10I|CCTNAGC(-5/-2)|
|BpuEI|CTTGAG(16/14)|
|BsaAI|YAC/GTR|
|BsaBI|GATNN/NNATC|
|BsaHI|GR/CGYC|
|BsaI|GGTCTC(1/5)|
|BsaJI|C/CNNGG|
|BsaWI|W/CCGGW|
|BsaXI|(9/12)ACNNNNNCTCC(10/7)|
|BseRI|GAGGAG(10/8)|
|BseYI|CCCAGC(-5/-1)|
|BsgI|GTGCAG(16/14)|
|BsiEI|CGRY/CG|
|BsiHKAI|GWGCW/C|
|BsiWI|C/GTACG|
|BslI|CCNNNNN/NNGG|
|BsmAI|GTCTC(1/5)|
|BsmBI|CGTCTC(1/5)|
|BsmFI|GGGAC(10/14)|
|BsmI|GAATGC(1/-1)|
|BsoBI|C/YCGRG|
|Bsp1286I|GDGCH/C|
|BspCNI|CTCAG(9/7)|
|BspDI|AT/CGAT|
|BspEI|T/CCGGA|
|BspHI|T/CATGA|
|BspMI|ACCTGC(4/8)|
|BspQI|GCTCTTC(1/4)|
|BsrBI|CCGCTC(-3/-3)|
|BsrDI|GCAATG(2/0)|
|BsrFI|R/CCGGY|
|BsrGI|T/GTACA|
|BsrI|ACTGG(1/-1)|
|BssHII|G/CGCGC|
|BssKI|/CCNGG|
|BssSI|CACGAG(-5/-1)|
|BstAPI|GCANNNN/NTGC|
|BstBI|TT/CGAA|
|BstEII|G/GTNACC|
|BstNI|CC/WGG|
|BstUI|CG/CG|
|BstXI|CCANNNNN/NTGG|
|BstXI|CCANNNNN/NTGG|
|BstYI|R/GATCY|
|BstZ17I|GTA/TAC|
|Bsu36I|CC/TNAGG|
|BtgI|C/CRYGG|
|BtgZI|GCGATG(10/14)|
|BtsCI|GGATG(2/0)|
|BtsI|GCAGTG(2/0)|
|Cac8I|GCN/NGC|
|ClaI|AT/CGAT|
|CspCI|(11/13)CAANNNNNGTGG(12/10)|
|CviAII|C/ATG|
|CviKI-1|RG/CY|
|CviQI|G/TAC|
|DdeI|C/TNAG|
|DpnI|GA/TC|
|DpnII|/GATC|
|DraI|TTT/AAA|
|DraIII|CACNNN/GTG|
|DrdI|GACNNNN/NNGTC|
|EaeI|Y/GGCCR|
|EagI|C/GGCCG|
|EarI|CTCTTC(1/4)|
|EciI|GGCGGA(11/9)|
|EcoNI|CCTNN/NNNAGG|
|EcoO109I|RG/GNCCY|
|EcoP15I|CAGCAG(25/27)|
|EcoRI|G/AATTC|
|EcoRV|GAT/ATC|
|FatI|/CATG|
|FauI|CCCGC(4/6)|
|Fnu4HI|GC/NGC|
|FokI|GGATG(9/13)|
|FseI|GGCCGG/CC|
|FspI|TGC/GCA|
|HaeII|RGCGC/Y|
|HaeIII|GG/CC|
|HgaI|GACGC(5/10)|
|HhaI|GCG/C|
|HincII|GTY/RAC|
|HindIII|A/AGCTT|
|HinfI|G/ANTC|
|HinP1I|G/CGC|
|HpaI|GTT/AAC|
|HpaII|C/CGG|
|HphI|GGTGA(8/7)|
|Hpy166II|GTN/NAC|
|Hpy188I|TCN/GA|
|Hpy188III|TC/NNGA|
|Hpy99I|CGWCG/|
|HpyAV|CCTTC(6/5)|
|HpyCH4III|ACN/GT|
|HpyCH4IV|A/CGT|
|HpyCH4V|TG/CA|
|I-CeuI|CGTAACTATAACGGTCCTAAGGTAGCGAA(-9/-13)|
|I-SceI|TAGGGATAACAGGGTAAT(-9/-13)|
|KasI|G/GCGCC|
|KpnI|GGTAC/C|
|MboI|/GATC|
|MboII|GAAGA(8/7)|
|MfeI|C/AATTG|
|MluI|A/CGCGT|
|MlyI|GAGTC(5/5)|
|MmeI|TCCRAC(20/18)|
|MnlI|CCTC(7/6)|
|MscI|TGG/CCA|
|MseI|T/TAA|
|MslI|CAYNN/NNRTG|
|MspA1I|CMG/CKG|
|MspI|C/CGG|
|MwoI|GCNNNNN/NNGC|
|NaeI|GCC/GGC|
|NarI|GG/CGCC|
|Nb.BbvCI|CCTCAGC|
|Nb.BsmI|GAATGC|
|Nb.BsrDI|GCAATG|
|Nb.BtsI|GCAGTG|
|NciI|CC/SGG|
|NcoI|C/CATGG|
|NdeI|CA/TATG|
|NgoMIV|G/CCGGC|
|NheI|G/CTAGC|
|NheI-HF™|G/CTAGC|
|NlaIII|CATG/|
|NlaIV|GGN/NCC|
|NmeAIII|GCCGAG(21/19)|
|NotI|GC/GGCCGC|
|NruI|TCG/CGA|
|NsiI|ATGCA/T|
|NspI|RCATG/Y|
|Nt.AlwI|GGATC(4/-5)|
|Nt.BbvCI|CCTCAGC(-5/-7)|
|Nt.BspQI|GCTCTTC(1/-7)|
|Nt.BstNBI|GAGTC(4/-5)|
|Nt.CviPII|(0/-1)CCD|
|PacI|TTAAT/TAA|
|PaeR7I|C/TCGAG|
|PciI|A/CATGT|
|PflFI|GACN/NNGTC|
|PflMI|CCANNNN/NTGG|
|PhoI|GG/CC|
|PI-PspI|TGGCAAACAGCTATTATGGGTATTATGGGT(-13/-17)|
|PI-SceI|ATCTATGTCGGGTGCGGAGAAAGAGGTAAT(-15/-19)|
|PleI|GAGTC(4/5)|
|PmeI|GTTT/AAAC|
|PmlI|CAC/GTG|
|PpuMI|RG/GWCCY|
|PshAI|GACNN/NNGTC|
|PsiI|TTA/TAA|
|PspGI|/CCWGG|
|PspOMI|G/GGCCC|
|PspXI|VC/TCGAGB|
|PstI|CTGCA/G|
|PvuI|CGAT/CG|
|PvuII|CAG/CTG|
|PvuII-HF™|CAG/CTG|
|RsaI|GT/AC|
|RsrII|CG/GWCCG|
|SacI|GAGCT/C|
|SacII|CCGC/GG|
|SalI|G/TCGAC|
|SalI-HF™|G/TCGAC|
|SapI|GCTCTTC(1/4)|
|Sau3AI|/GATC|
|Sau96I|G/GNCC|
|SbfI|CCTGCA/GG|
|ScaI|AGT/ACT|
|ScaI-HF™|AGT/ACT|
|ScrFI|CC/NGG|
|SexAI|A/CCWGGT|
|SfaNI|GCATC(5/9)|
|SfcI|C/TRYAG|
|SfiI|GGCCNNNN/NGGCC|
|SfoI|GGC/GCC|
|SgrAI|CR/CCGGYG|
|SmaI|CCC/GGG|
|SmlI|C/TYRAG|
|SnaBI|TAC/GTA|
|SpeI|A/CTAGT|
|SphI|GCATG/C|
|SphI-HF™|GCATG/C|
|SspI|AAT/ATT|
|StuI|AGG/CCT|
|StyD4I|/CCNGG|
|StyI|C/CWWGG|
|SwaI|ATTT/AAAT|
|TaqaI|T/CGA|
|TfiI|G/AWTC|
|TliI|C/TCGAG|
|TseI|G/CWGC|
|Tsp45I|/GTSAC|
|Tsp509I|/AATT|
|TspMI|C/CCGGG|
|TspRI|NNCASTGNN/|
|Tth111I|GACN/NNGTC|
|XbaI|T/CTAGA|
|XcmI|CCANNNNN/NNNNTGG|
|XhoI|C/TCGAG|
|XmaI|C/CCGGG|
|XmnI|GAANN/NNTTC|
|ZraI|GAC/GTC|
{{hbox{the Big Question}}}We are investigating how, when and where PCM, the L-isoaspartyl protein carboxyl methyltransferase, acts //in vivo// to enhance survival of //Escherichia coli// in long-term [G[stationary phase|stat_phase]]. We anticipate that our results will lead directly to better understanding of this key protein repair mechanism and indirectly to insights important to the study of aging and significant degenerative diseases. The pages in this topic give detailed background information on our research, suitable for a student who plans to actually work in our lab. For a more general overview, see the [[Research Overview]] section instead.

{{hbox{PCM's significance}}}The nearly ubiquitous protein-repair enzyme [G[PCM|pcm]], repairs abnormal [G[isoaspartate|isoasp]] (isoAsp) residues in proteins. These form spontaneously from [G[aspartate|asp]] (Asp) or [G[asparagine|asn]] (Asn) amino acids as shown in the animation at right. Isoaspartyl damage can dramatically reduce protein function###Clarke2003###, and the inability to repair isoAsp damage has been linked to significant pathologic conditions, including aging,###Kim1997######Chavous2001######Visick1998### autoimmunity,###Doyle2003######Wagner2007######Yang2006### epilepsy###Lanthier2002######Kim1997### and tumor progression###Lapointe2005###. PCM recognizes and methylates isoAsp, resulting in net repair of the damage.

{{hbox{Hypotheses}}}Despite a clear understanding of PCM's enzymatic function and the interesting phenotypes of //pcm// mutants, many open questions remain regarding the enzyme's specific roles //in vivo//. We hope to answer some of these questions using the bacterium //Escherichia coli//. We have learned previously (see [[Results]]) that mutations that inactivate the //E. coli// //pcm// gene&mdash;leaving the bacteria unable to repair isoAsp damage&mdash;reduce the ability of aging cells to survive stress###Visick1998###. Our recent work suggests two hypotheses:
#PCM may enhance stress survival by functioning in concert with chaperons or other maintenance factors to stabilize protein conformation
#Repair activity may be advantageous to metabolically active subpopulations in aging //E. coli// cultures and to recovering cells, but not to subpopulations that are truly metabolically inactive
Our current [[projects|Projects]] are testing several aspects of these two major hypotheses.

<html>
<div name='simple'>
  <form id='searchForm' name='searchForm' class="formPanel">
  <div class="box"><div class="stitle">Simple search:</div>
    Search for:<input type='text' id='searchText' name='searchText' />&nbsp;&nbsp;&nbsp;<input type='radio' name='sType' value='and' checked> All words<input type='radio' name='sType' value='or'> Any words<input type='radio' name='sType' value='phrase'> Phrase
    <div>&nbsp;&nbsp;&nbsp;Search in: <input type='checkbox' name='inWhich' value='rtitle' checked>Title<input type='checkbox' name='inWhich' value='alist' checked>Authors<input type='checkbox' name='inWhich' value='abstract' checked>Abstract<input type='checkbox' name='inWhich' value='file'>File<input type='checkbox' name='inWhich' value='tags'>Tags<input type='checkbox' name='inWhich' value='notes'>Notes</div>
  </div>
  <div class="box">
    <div class="stitle">Advanced search:</div>
    <table border="0" cellspacing="0" cellpadding="2" width="100%"><tr><td width="50%" style='text-align: right; vertical-align: top;'>
    Title:<input type='text' name='rtitle'><br>
    Authors:<input type='text' name='alist'><br>
    Abstract:<input type='text' name='abstract'><br>
    Journal:<input type='text' name='fjournal'><br>
    File:<input type='text' name='file'><br>
    Tags:<input type='text' name='tags'><br>
    Notes:<input type='text' name='notes'><br></td><td style="vertical-align: top;padding-left: 12px;">Search <u>terms</u>:<br><input type='radio' name='tType' value='and' checked> All words<br><input type='radio' name='tType' value='or'> Any words<br><input type='radio' name='tType' value='phrase'> Phrase<br><br>Search <u>fields</u>:<br><input type='radio' name='fType' value='and'> All fields<br><input type='radio' name='fType' value='or' checked> Any field</td></tr></table>
  </div>
  <div class='submitButtons'>
    <span>
      <input type='submit' class='sButton' value='Cancel' /><input type='submit' class='sButton' id='searchButton' value='Search' />
    </span>
  </div>
  </form>
</div>
</html>
/***
|Name|SearchOptionsPlugin|
|Source|http://www.TiddlyTools.com/#SearchOptionsPlugin|
|Documentation|http://www.TiddlyTools.com/#SearchOptionsPluginInfo|
|Version|3.0.9|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|extend core search function with additional user-configurable options|
Adds extra options to core search function including selecting which data items to search, enabling/disabling incremental key-by-key searches, and generating a ''list of matching tiddlers'' instead of immediately displaying all matches.  This plugin also adds syntax for rendering 'search links' within tiddler content to embed one-click searches using pre-defined 'hard-coded' search terms.
!!!!!Documentation
>see [[SearchOptionsPluginInfo]]
!!!!!Configuration
<<<
<<tiddler SearchOptions>>
<<option chkSearchResultsOptions>> Include {{{options...}}} slider in "search again" form
<<<
!!!!!Revisions
<<<
2011.03.18 3.0.9 moved configuration controls to [[SearchOptions]] shadow tiddler
|please see [[SearchOptionsPluginInfo]] for additional revision details|
2005.10.18 1.0.0 Initial Release
<<<
!!!!!Code
***/
//{{{
version.extensions.SearchOptionsPlugin= {major: 3, minor: 0, revision: 9, date: new Date(2011,3,18)};
//}}}
//{{{
var defaults={
	chkSearchTitles:	true,
	chkSearchText:		true,
	chkSearchTags:		true,
	chkSearchFields:	true,
	chkSearchTitlesFirst:	true,
	chkSearchList:		true,
	chkSearchHighlight:	true,
	chkSearchListTiddler:	false,
	chkSearchByDate:	false,
	chkIncrementalSearch:	true,
	chkSearchShadows:	true,
	chkSearchOpenTiddlers:	false,
	chkSearchResultsOptions:true,
	chkSearchExcludeTags:	true,
	txtSearchExcludeTags:	'excludeSearch',
	txtIncrementalSearchDelay:	500,
	txtIncrementalSearchMin:	3
}; for (var id in defaults) if (config.options[id]===undefined)
	config.options[id]=defaults[id];
if (config.macros.search.reportTitle==undefined)
	config.macros.search.reportTitle="SearchResults"; // note: not a cookie!
config.macros.search.label+="\xa0"; // a little bit of space just because it looks better
//}}}
// // searchLink: {{{[search[text to find]] OR [search[text to display|text to find]]}}}
//{{{
config.formatters.push( {
	name: "searchLink",
	match: "\\[search\\[",
	lookaheadRegExp: /\[search\[(.*?)(?:\|(.*?))?\]\]/mg,
	prompt: "search for: '%0'",
	handler: function(w)
	{
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			var label=lookaheadMatch[1];
			var text=lookaheadMatch[2]||label;
			var prompt=this.prompt.format([text]);
			var btn=createTiddlyButton(w.output,label,prompt,
				function(){story.search(this.getAttribute("searchText"))},"searchLink");
			btn.setAttribute("searchText",text);
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	}
});
//}}}
// // incremental search uses option settings instead of hard-coded delay and minimum input values
//{{{
var fn=config.macros.search.onKeyPress;
fn=fn.toString().replace(/500/g, "config.options.txtIncrementalSearchDelay||500");
fn=fn.toString().replace(/> 2/g, ">=(config.options.txtIncrementalSearchMin||3)");
eval("config.macros.search.onKeyPress="+fn);
//}}}
// // REPLACE story.search() for option to "show search results in a list"
//{{{
Story.prototype.search = function(text,useCaseSensitive,useRegExp)
{
	var co=config.options; // abbrev
	var re=new RegExp(useRegExp ? text : text.escapeRegExp(),useCaseSensitive ? "mg" : "img");
	if (config.options.chkSearchHighlight) highlightHack=re;
	var matches = store.search(re,co.chkSearchByDate?"modified":"title","");
	if (co.chkSearchByDate) matches=matches.reverse(); // most recent first
	var q = useRegExp ? "/" : "'";
	clearMessage();
	if (!matches.length) {
		if (co.chkSearchListTiddler) discardSearchResults();
		displayMessage(config.macros.search.failureMsg.format([q+text+q]));
	} else {
		if (co.chkSearchList||co.chkSearchListTiddler) 
			reportSearchResults(text,matches);
		else {
			var titles = []; for(var t=0; t<matches.length; t++) titles.push(matches[t].title);
			this.closeAllTiddlers(); story.displayTiddlers(null,titles);
			displayMessage(config.macros.search.successMsg.format([matches.length, q+text+q]));
		}
	}
	highlightHack = null;
}
//}}}
// // REPLACE store.search() for enhanced searching/sorting options
//{{{
TiddlyWiki.prototype.search = function(searchRegExp,sortField,excludeTag,match)
{
	var co=config.options; // abbrev
	var tids = this.reverseLookup("tags",excludeTag,!!match,sortField);
	var opened=[]; story.forEachTiddler(function(tid,elem){opened.push(tid);});

	// eliminate tiddlers tagged with excluded tags
	if (co.chkSearchExcludeTags&&co.txtSearchExcludeTags.length) {
		var ex=co.txtSearchExcludeTags.readBracketedList();
		var temp=[]; for(var t=tids.length-1; t>=0; t--)
			if (!tids[t].tags.containsAny(ex)) temp.push(tids[t]);
		tids=temp;
	}

	// scan for matching titles first...
	var results = [];
	if (co.chkSearchTitles) {
		for(var t=0; t<tids.length; t++) {
			if (co.chkSearchOpenTiddlers && !opened.contains(tids[t].title)) continue; 
			if(tids[t].title.search(searchRegExp)!=-1) results.push(tids[t]);
		}
		if (co.chkSearchShadows)
			for (var t in config.shadowTiddlers) {
				if (co.chkSearchOpenTiddlers && !opened.contains(t)) continue; 
				if ((t.search(searchRegExp)!=-1) && !store.tiddlerExists(t))
					results.push((new Tiddler()).assign(t,config.shadowTiddlers[t]));
			}
	}
	// then scan for matching text, tags, or field data
	for(var t=0; t<tids.length; t++) {
		if (co.chkSearchOpenTiddlers && !opened.contains(tids[t].title)) continue; 
		if (co.chkSearchText && tids[t].text.search(searchRegExp)!=-1)
			results.pushUnique(tids[t]);
		if (co.chkSearchTags && tids[t].tags.join(" ").search(searchRegExp)!=-1)
			results.pushUnique(tids[t]);
		if (co.chkSearchFields && store.forEachField!=undefined)
			store.forEachField(tids[t],
				function(tid,field,val) {
					if (val.search(searchRegExp)!=-1) results.pushUnique(tids[t]);
				},
				true); // extended fields only
	}
	// then check for matching text in shadows
	if (co.chkSearchShadows)
		for (var t in config.shadowTiddlers) {
			if (co.chkSearchOpenTiddlers && !opened.contains(t)) continue; 
			if ((config.shadowTiddlers[t].search(searchRegExp)!=-1) && !store.tiddlerExists(t))
				results.pushUnique((new Tiddler()).assign(t,config.shadowTiddlers[t]));
		}

	// if not 'titles first', or sorting by modification date,
	// re-sort results to so titles, text, tag and field matches are mixed together
	if(!sortField) sortField = "title";
	var bySortField=function(a,b){
		if(a[sortField]==b[sortField])return(0);else return(a[sortField]<b[sortField])?-1:+1;
	}
	if (!co.chkSearchTitlesFirst || co.chkSearchByDate) results.sort(bySortField);

	return results;
}
//}}}
// // HIJACK core {{{<<search>>}}} macro to add "report" and "simple inline" output
//{{{
config.macros.search.SOP_handler=config.macros.search.handler;
config.macros.search.handler = function(place,macroName,params)
{
	// if "report", use SearchOptionsPlugin report generator for inline output
	if (params[1]&&params[1].substr(0,6)=="report") {
		var keyword=params[0];
		var options=params[1].split("=")[1]; // split "report=option+option+..."
		var heading=params[2]?params[2].unescapeLineBreaks():"";
		var matches=store.search(new RegExp(keyword.escapeRegExp(),"img"),"title","excludeSearch");
		if (matches.length) wikify(heading+window.formatSearchResults(keyword,matches,options),place);
	} else if (params[1]) {
		var keyword=params[0];
		var heading=params[1]?params[1].unescapeLineBreaks():"";
		var seperator=params[2]?params[2].unescapeLineBreaks():", ";
		var matches=store.search(new RegExp(keyword.escapeRegExp(),"img"),"title","excludeSearch");
		if (matches.length) {
			var out=[];
			for (var m=0; m<matches.length; m++) out.push("[["+matches[m].title+"]]");
			wikify(heading+out.join(seperator),place);
		}
	} else
		config.macros.search.SOP_handler.apply(this,arguments);
};
//}}}
// // SearchResults panel handling
//{{{
setStylesheet(".searchResults { padding:1em 1em 0 1em; }","searchResults"); // matches std tiddler padding

config.macros.search.createPanel=function(text,matches,body) {

	function getByClass(e,c) { var d=e.getElementsByTagName("div");
		for (var i=0;i<d.length;i++) if (hasClass(d[i],c)) return d[i]; }
	var panel=createTiddlyElement(null,"div","searchPanel","searchPanel");
	this.renderPanel(panel,text,matches,body);
	var oldpanel=document.getElementById("searchPanel");
	if (!oldpanel) { // insert new panel just above tiddlers
		var da=document.getElementById("displayArea");
		da.insertBefore(panel,da.firstChild);
	} else { // if panel exists
		var oldwrap=getByClass(oldpanel,"searchResults");
		var newwrap=getByClass(panel,"searchResults");
		// if no prior content, just insert new content
		if (!oldwrap) oldpanel.insertBefore(newwrap,null);
		else {	// swap search results content but leave containing panel intact
			oldwrap.style.display='block'; // unfold wrapper if needed
			var i=oldwrap.getElementsByTagName("input")[0]; // get input field
			if (i) { var pos=this.getCursorPos(i); i.onblur=null; } // get cursor pos, ignore blur
			oldpanel.replaceChild(newwrap,oldwrap);
			panel=oldpanel; // use existing panel
		} 
	}
	this.showPanel(true,pos);
	return panel;
}

config.macros.search.renderPanel=function(panel,text,matches,body) {

	var wrap=createTiddlyElement(panel,"div",null,"searchResults");
	wrap.onmouseover = function(e){ addClass(this,"selected"); }
	wrap.onmouseout = function(e){ removeClass(this,"selected"); }
	// create toolbar: "open all", "fold/unfold", "close"
	var tb=createTiddlyElement(wrap,"div",null,"toolbar");
	var b=createTiddlyButton(tb, "open all", "open all matching tiddlers", function() {
		story.displayTiddlers(null,this.getAttribute("list").readBracketedList()); return false; },"button");
	var list=""; for(var t=0;t<matches.length;t++) list+='[['+matches[t].title+']] ';
	b.setAttribute("list",list);
	var b=createTiddlyButton(tb, "fold", "toggle display of search results", function() {
		config.macros.search.foldPanel(this); return false; },"button");
	var b=createTiddlyButton(tb, "close", "dismiss search results",	function() {
		config.macros.search.showPanel(false); return false; },"button");
	createTiddlyText(createTiddlyElement(wrap,"div",null,"title"),"Search for: "+text); // title
	wikify(body,createTiddlyElement(wrap,"div",null,"viewer")); // report
	return panel;
}

config.macros.search.showPanel=function(show,pos) {
	var panel=document.getElementById("searchPanel");
	var i=panel.getElementsByTagName("input")[0];
	i.onfocus=show?function(){config.macros.search.stayFocused(true);}:null;
	i.onblur=show?function(){config.macros.search.stayFocused(false);}:null;
	if (show && panel.style.display=="block") { // if shown, grab focus, restore cursor
		if (i&&this.stayFocused()) { i.focus(); this.setCursorPos(i,pos); }
		return;
	}
	if(!config.options.chkAnimate) {
		panel.style.display=show?"block":"none";
		if (!show) { removeChildren(panel); config.macros.search.stayFocused(false); }
	} else {
		var s=new Slider(panel,show,false,show?"none":"children");
		s.callback=function(e,p){e.style.overflow="visible";}
		anim.startAnimating(s);
	}
	return panel;
}

config.macros.search.foldPanel=function(button) {
	var d=document.getElementById("searchPanel").getElementsByTagName("div");
	for (var i=0;i<d.length;i++) if (hasClass(d[i],"viewer")) var v=d[i]; if (!v) return;
	var show=v.style.display=="none";
	if(!config.options.chkAnimate)
		v.style.display=show?"block":"none";
	else {
		var s=new Slider(v,show,false,"none");
		s.callback=function(e,p){e.style.overflow="visible";}
		anim.startAnimating(s);
	}
	button.innerHTML=show?"fold":"unfold";
	return false;
}

config.macros.search.stayFocused=function(keep) { // TRUE/FALSE=set value, no args=get value
	if (keep===undefined) return this.keepReportInFocus;
	this.keepReportInFocus=keep;
	return keep
}	

config.macros.search.getCursorPos=function(i) {
	var s=0; var e=0; if (!i) return { start:s, end:e };
	try {
		if (i.setSelectionRange) // FF
			{ s=i.selectionStart; e=i.selectionEnd; }
		if (document.selection && document.selection.createRange) { // IE
			var r=document.selection.createRange().duplicate();
			var len=r.text.length; s=0-r.moveStart('character',-100000); e=s+len;
		}
	}catch(e){};
	return { start:s, end:e };
}
config.macros.search.setCursorPos=function(i,pos) {
	if (!i||!pos) return; var s=pos.start; var e=pos.end;
	if (i.setSelectionRange) //FF
		i.setSelectionRange(s,e);
	if (i.createTextRange) // IE
		{ var r=i.createTextRange(); r.collapse(true); r.moveStart("character",s); r.select(); }
}
//}}}
// // SearchResults report generation
// note: these functions are defined globally, so they can be more easily redefined to customize report formats//
//{{{
if (!window.reportSearchResults) window.reportSearchResults=function(text,matches)
{
	var cms=config.macros.search; // abbrev
	var body=window.formatSearchResults(text,matches);
	if (!config.options.chkSearchListTiddler) // show #searchResults panel
		window.scrollTo(0,ensureVisible(cms.createPanel(text,matches,body)));
	else { // write [[SearchResults]] tiddler
		var title=cms.reportTitle;
		var who=config.options.txtUserName;
		var when=new Date();
		var tags="excludeLists excludeSearch temporary";
		var tid=store.getTiddler(title); if (!tid) tid=new Tiddler();
		tid.set(title,body,who,when,tags);
		store.addTiddler(tid);
		story.closeTiddler(title);
		story.displayTiddler(null,title);
	}
}

if (!window.formatSearchResults) window.formatSearchResults=function(text,matches,opt)
{
	var body='';
	var title=config.macros.search.reportTitle
	var q = config.options.chkRegExpSearch ? "/" : "'";
	if (!opt) var opt="all";
	var parts=opt.split("+");
	for (var i=0; i<parts.length; i++) { var p=parts[i].toLowerCase();
		if (p=="again"||p=="all")   body+=window.formatSearchResults_again(text,matches);
		if (p=="summary"||p=="all") body+=window.formatSearchResults_summary(text,matches);
		if (p=="list"||p=="all")    body+=window.formatSearchResults_list(text,matches);
		if (p=="buttons"||p=="all") body+=window.formatSearchResults_buttons(text,matches);
	}
	return body;
}

if (!window.formatSearchResults_again) window.formatSearchResults_again=function(text,matches)
{
	var title=config.macros.search.reportTitle
	var body='';
	// search again
	body+='{{span{<<search "'+text.replace(/"/g,'&#x22;')+'">> /%\n';
	body+='%/<html><input type="button" value="search again"';
	body+=' onclick="var t=this.parentNode.parentNode.getElementsByTagName(\'input\')[0];';
	body+=' config.macros.search.doSearch(t); return false;">';
	if (!config.options.chkSearchResultsOptions) // omit "options..."
		body+='</html>';
	else {
		body+=' <a href="javascript:;" onclick="';
		body+=' var e=this.parentNode.nextSibling;';
		body+=' var show=e.style.display!=\'block\';';
		body+=' if(!config.options.chkAnimate) e.style.display=show?\'block\':\'none\';';
		body+=' else anim.startAnimating(new Slider(e,show,false,\'none\'));';
		body+=' return false;">options...</a>';
		body+='</html>@@display:none;border-left:1px dotted;margin-left:1em;padding:0;padding-left:.5em;font-size:90%;/%\n';
		body+='	%/<<tiddler SearchOptions>>@@';
	};
	body+='}}}\n\n';
	return body;
}

if (!window.formatSearchResults_summary) window.formatSearchResults_summary=function(text,matches)
{
	// summary: nn tiddlers found matching '...', options used
	var body='';
	var co=config.options; // abbrev
	var title=config.macros.search.reportTitle
	var q = co.chkRegExpSearch ? "/" : "'";
	body+="''"+config.macros.search.successMsg.format([matches.length,q+"{{{"+text+"}}}"+q])+"''\n";
	var opts=[];
	if (co.chkSearchTitles) opts.push("titles");
	if (co.chkSearchText) opts.push("text");
	if (co.chkSearchTags) opts.push("tags");
	if (co.chkSearchFields) opts.push("fields");
	if (co.chkSearchShadows) opts.push("shadows");
	if (co.chkSearchOpenTiddlers) body+="^^//search limited to displayed tiddlers only//^^\n";
	body+="~~&nbsp; searched in "+opts.join(" + ")+"~~\n";
	body+=(co.chkCaseSensitiveSearch||co.chkRegExpSearch?"^^&nbsp; using ":"")
		+(co.chkCaseSensitiveSearch?"case-sensitive ":"")
		+(co.chkRegExpSearch?"pattern ":"")
		+(co.chkCaseSensitiveSearch||co.chkRegExpSearch?"matching^^\n":"");
	return body;
}

if (!window.formatSearchResults_list) window.formatSearchResults_list=function(text,matches)
{
	// bullet list of links to matching tiddlers
	var body='';
	var co=config.options; // abbrev
	var pattern=co.chkRegExpSearch?text:text.escapeRegExp();
	var sensitive=co.chkCaseSensitiveSearch?"mg":"img";
	var link='{{tiddlyLinkExisting{<html><nowiki><a href="javascript:;" onclick="'
		+'if(config.options.chkSearchHighlight)'
		+'	highlightHack=new RegExp(\x27'+pattern+'\x27.escapeRegExp(),\x27'+sensitive+'\x27);'
		+'story.displayTiddler(null,\x27%0\x27);'
		+'highlightHack = null; return false;'
		+'" title="%2">%1</a></html>}}}';
	for(var t=0;t<matches.length;t++) {
		body+="* ";
		if (co.chkSearchByDate)
			body+=matches[t].modified.formatString('YYYY.0MM.0DD 0hh:0mm')+" ";
		var title=matches[t].title;
		var fixup=title.replace(/'/g,"\\x27").replace(/"/g,"\\x22");
		var tid=store.getTiddler(title);
		var tip=tid?tid.getSubtitle():''; tip=tip.replace(/"/g,"&quot;");
		body+=link.format([fixup,title,tip])+'\n';
	}
	return body;
}

if (!window.formatSearchResults_buttons) window.formatSearchResults_buttons=function(text,matches)
{
	// embed buttons only if writing SearchResults to tiddler
	if (!config.options.chkSearchListTiddler) return "";
	// "open all" button
	var title=config.macros.search.reportTitle;
	var body="";
	body+="@@diplay:block;<html><input type=\"button\" href=\"javascript:;\" "
		+"onclick=\"story.displayTiddlers(null,[";
	for(var t=0;t<matches.length;t++)
		body+="'"+matches[t].title.replace(/\'/mg,"\\'")+"'"+((t<matches.length-1)?", ":"");
	body+="],1);\" accesskey=\"O\" value=\"open all matching tiddlers\"></html> ";
	// "discard SearchResults" button
	body+="<html><input type=\"button\" href=\"javascript:;\" "
		+"onclick=\"discardSearchResults()\" value=\"discard "+title+"\"></html>";
	body+="@@\n";
	return body;
}

if (!window.discardSearchResults) window.discardSearchResults=function()
{
	// remove the tiddler
	story.closeTiddler(config.macros.search.reportTitle);
	store.deleteTiddler(config.macros.search.reportTitle);
	store.notify(config.macros.search.reportTitle,true);
}
//}}}
// // DELIVER [[SearchOptions]] shadow payload
//{{{
config.shadowTiddlers.SearchOptions = store.getTiddlerText('SearchOptionsPlugin##panel','');
config.annotations.SearchOptions    = 'created by SearchOptionsPlugin';
//}}}
/***
//{{{
!panel
search in:
  {{nowrap{<<option chkSearchTitles>>titles <<option chkSearchText>>text <<option chkSearchTags>>tags}}} /%
%/{{nowrap{<<option chkSearchFields>>fields <<option chkSearchShadows>>shadows}}}
----
  {{nowrap{<<option chkCaseSensitiveSearch>>case-sensitive}}} /%
%/{{nowrap{<<option chkRegExpSearch>>match text patterns}}}
  {{nowrap{<<option chkIncrementalSearch>>key-by-key search:}}} /%
	%/{{threechar smallform nowrap{<<option txtIncrementalSearchMin>> or more characters}}} /%
	%/{{threechar smallform nowrap{<<option txtIncrementalSearchDelay>> msec delay}}}<hr>
  {{nowrap{<<option chkSearchList>>show results in a list}}} /%
%/{{nowrap{<<option chkSearchTitlesFirst>>show title matches first}}}
  {{nowrap{<<option chkSearchByDate>>sort results by date}}} /%
%/{{nowrap{<<option chkSearchHighlight>>highlight matching text}}}
----
{{nowrap{<<option chkSearchOpenTiddlers>>search open tiddlers only}}}
{{nowrap{<<option chkSearchExcludeTags>>exclude tiddlers tagged with:}}}
{{editor{<<option txtSearchExcludeTags>>}}}
!end
//}}}
***/
 
/***
|Name|SectionLinksPlugin|
|Source|http://www.TiddlyTools.com/#SectionLinksPlugin|
|Documentation|http://www.TiddlyTools.com/#SectionLinksPlugin|
|Version|1.4.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|allow tiddler sections in TiddlyLinks to be used as anchor points|
This plugin enhances the processing of section references so they can be used in links to auto-scroll to the indicated heading within a tiddler (i.e., similar to the 'anchor' behavior provided in HTML by {{{<a name="foo">}}} and {{{<a href="#foo">...</a>}}})
!!!Usage
<<<
!!!!~TiddlyLink syntax
>The standard link syntax has been extended so that a section name can included in a tiddler link (e.g., {{{[[SomeTiddler##SomeSection]]}}}).  When clicked, the tiddler is displayed and the specified section heading will be automatically scrolled into view. If the tiddler title is omitted or the 'here' keyword is used (e.g., {{{[[##SomeSection]]}}} or {{{[[here##SomeSection]]>>}}}), then the current containing tiddler is implied by default.
>
>//Note: the enhanced "section"" link syntax can also be used with ''anchor'' elements defined by HTML syntax://
>>{{{<html><a name="sectionname" /></html>}}}
>//This provides an alternative syntax can automatically scroll to content without requiring use of the standard TW section ''heading'' syntax.//
!!!!{{{<<tiddler>>}}} macro 
>The {{{<<tiddler SomeTiddler##SomeSection>>}}} syntax has been extended so that when the tiddler title is omitted or the 'here' keyword is used (e.g., {{{<<tiddler ##SomeSection>>}}} or {{{<<tiddler here##SomeSection>>}}}), then the current containing tiddler is implied by default.
!!!!"""<<sectionTOC>>""" macro
>This macro generates a 'Table of Contents'-style numbered-bullet list with links to all sections within the current tiddler.  Simply place the following macro at the //end of the tiddler content// (i.e., following all section headings):
{{{
<<sectionTOC>> or <<sectionTOC className>>
}}}
>Note: The macro must occur at the end of the tiddler in order to locate the rendered section headings that precede it. In addition, to position the macro's //output// within the tiddler, you must create a special 'target element' that uses a specified classname (default='sectionTOC'), like this:
{{{
{{sectionTOC{}}}
}}}
>When the {{{<<sectionTOC>>}}} macro is rendered, it will find the matching 'sectionTOC'-classed element and writes it's output there.  You can also add the macro and/or target elements directly to the [[ViewTemplate]] definition, so that every tiddler can automatically display the table of contents:
{{{
<span class='sectionTOC'></span> <!-- target element -->
...
<span macro='sectionTOC'></span> <!-- must be at end of tiddler -->
}}}
<<<
!!!Examples
<<<
links to sections defined by ''TW heading syntax'' (e.g, {{{!!!sectionname}}}):{{indent{
[[SectionLinksPlugin##onClickTiddlerLink]]
[[##onClickTiddlerLink]] //(current tiddler implied)//}}}
links to anchors defined by ''HTML syntax'' (e.g., {{{<html><a href="anchorname"></html>}}}):{{indent{
[[SectionLinksPlugin##sampleanchorlink]]
[[##sampleanchorlink]] //(current tiddler implied)//}}}
<<<
!!!Revisions
<<<
2011.02.08 1.4.1 in isExternalLink() hijack, strip section references before testing for external link
2010.08.09 1.4.0 in scrollToSection(), added support for using HTML <a name="..."> anchor elements
2009.08.21 1.3.4 added handling to ignore leading/trailing whitespace in section references
2009.08.21 1.3.3 in createTiddlyLink(), add tiddlyLinkNonExistingSection class if matching section is not found
2009.08.14 1.3.2 in createTiddlyLink(), don't override core value for ~TiddlyLink attribute
2009.08.02 1.3.1 in sectionTOC.handler(), trim leading/trailing whitespace from generated section links
2009.08.01 1.3.0 in scrollToSection(), apply 3-tier section matching (exact, startsWith, contains)
2009.07.06 1.2.2 fixed displayTiddler() hijack
2009.07.03 1.2.1 in {{{<<sectionTOC>>}}}, suppress output if target is not found
2009.06.02 1.2.0 added support for 'here' keyword in {{{[[here##section]]}}} links and {{{<<tiddler here##section>>}}} macro
2009.04.09 1.1.1 in sectionTOC macro, make target visible when TOC is rendered.
2009.01.18 1.1.0 added {{{<<sectionTOC>>}}} macro to generate numbered-bullet links to sections of current tiddler
2009.01.06 1.0.0 converted to stand-alone plugin
2008.10.14 0.0.0 initial release (as [[CoreTweaks]] #784 - http://trac.tiddlywiki.org/ticket/784)
<<<
!!!Code
***/
//{{{
version.extensions.SectionLinksPlugin= {major: 1, minor: 4, revision: 1, date: new Date(2011,2,8)};

Story.prototype.scrollToSection = function(title,section) {
	if (!title||!section) return; var t=this.getTiddler(title); if (!t) return null;
	var elems=t.getElementsByTagName('*');
	var heads=[]; var anchors=[];
	for (var i=0; i<elems.length; i++)
		if (['H1','H2','H3','H4','H5'].contains(elems[i].nodeName)) heads.push(elems[i]);
	for (var i=0; i<elems.length; i++)
		if (elems[i].nodeName=='A' && (elems[i].getAttribute('name')||'').length) anchors.push(elems[i]);
	var found=null;
	for (var i=0; i<heads.length; i++)
		if (getPlainText(heads[i]).trim()==section) { found=heads[i]; break; }
	if (!found) for (var i=0; i<heads.length; i++)
		if (getPlainText(heads[i]).trim().startsWith(section)) { found=heads[i]; break; }
	if (!found) for (var i=0; i<heads.length; i++)
		if (getPlainText(heads[i]).trim().indexOf(section)!=-1) { found=heads[i]; break; }
	if (!found) for (var i=0; i<anchors.length; i++)
		if (anchors[i].getAttribute('name')==section) { found=anchors[i]; break; }
	if (!found) for (var i=0; i<anchors.length; i++)
		if (anchors[i].getAttribute('name').startsWith(section)) { found=anchors[i]; break; }
	if (!found) for (var i=0; i<anchors.length; i++)
		if (anchors[i].getAttribute('name').indexOf(section)!=-1) { found=anchors[i]; break; }
	if (found) {
		// if section heading is collapsed, click to expand it - see [[FoldHeadingsPlugin]]
		if (hasClass(found,'foldable') && found.nextSibling.style.display=='none') found.onclick();
		// scroll *after* tiddler animation
		var delay=config.options.chkAnimate?config.animDuration+100:0;
		setTimeout('window.scrollTo('+findPosX(found)+','+findPosY(found)+')',delay);
		return found;
	}
}
//}}}
/***
!!!!core hijacks
***/
/***
!!!!!createTiddlyLink
***/
//{{{
// [[tiddlername##section]] and [[##section]]
if (!window.createTiddlyLink_section)
	window.createTiddlyLink_section=window.createTiddlyLink;
window.createTiddlyLink=function(place,title) {
	var t=story.findContainingTiddler(place); var tid=t?t.getAttribute('tiddler'):'';
	var parts=title.split(config.textPrimitives.sectionSeparator);
	var title=parts[0]; var section=parts[1]; if (section) section=section.trim();
	if (!title.length || title.toLowerCase()=='here') title=tid;  // default=current tiddler
	arguments[1]=title;
	var btn=createTiddlyLink_section.apply(this,arguments);
	if (section) {
		btn.setAttribute('section',section);
		if (store.getTiddlerText(title+config.textPrimitives.sectionSeparator+section)===null)
			addClass(btn,'tiddlyLinkNonExistingSection');
	}
	return btn;
}
//}}}
/***
!!!!!onClickTiddlerLink
***/
//{{{
if (!window.onClickTiddlerLink_section)
	window.onClickTiddlerLink_section=window.onClickTiddlerLink;
window.onClickTiddlerLink=function(ev) {
	var e=ev||window.event;	var target=resolveTarget(e); var title=null;
	while (target!=null && title==null) {
		title=target.getAttribute('tiddlyLink');
		section=target.getAttribute('section');
		target=target.parentNode;
	} 
	var t=story.findContainingTiddler(target); var tid=t?t.getAttribute('tiddler'):'';
	if (title!=tid||!section) // avoid excess scrolling for intra-tiddler links
		onClickTiddlerLink_section.apply(this,arguments);
	story.scrollToSection(title,section);
	return false;
}
//}}}
/***
!!!!! displayTiddler
***/
//{{{
if (!Story.prototype.displayTiddler_section)
	Story.prototype.displayTiddler_section=Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function(srcElement,tiddler)
{
	var title=(tiddler instanceof Tiddler)?tiddler.title:tiddler;
	var parts=title.split(config.textPrimitives.sectionSeparator);
	var title=parts[0]; var section=parts[1]; if (section) section=section.trim();
	if (!title.length || title.toLowerCase()=='here') {
		var t=story.findContainingTiddler(place);
		title=t?t.getAttribute('tiddler'):'';
	}
	arguments[1]=title;  // default=current tiddler
	this.displayTiddler_section.apply(this,arguments);
	story.scrollToSection(title,section);
}
//}}}
/***
<html><a name="sampleanchorlink" /></html>This is a sample ''anchor link'': {{{<html><a name="sampleanchorlink" /></html>}}}
!!!!!isExternalLink
***/
//{{{
if (!config.formatterHelpers.isExternalLink_section)
	config.formatterHelpers.isExternalLink_section=config.formatterHelpers.isExternalLink;
config.formatterHelpers.isExternalLink=function(link) {  // remove section references before testing
	var l=link.split(config.textPrimitives.sectionSeparator)[0];
	return config.formatterHelpers.isExternalLink_section(l);
}
//}}}
/***
!!!!!tiddler.handler
***/
//{{{
if (!config.macros.tiddler.handler_section)
	config.macros.tiddler.handler_section=config.macros.tiddler.handler;
config.macros.tiddler.handler=function(place,macroName,params,wikifier,paramString,tiddler)
{
	if (!params[0]) return;
	var sep=config.textPrimitives.sectionSeparator;
	var parts=params[0].split(sep); var tid=parts[0]; var sec=parts[1]; if (sec) sec=sec.trim();
	if ((tid.toLowerCase()=='here'||!tid.length) && sec) { // fixup for 'here##section' and '##section'
		var here=story.findContainingTiddler(place)
		var tid=here?here.getAttribute('tiddler'):tiddler?tiddler.title:'';
		arguments[2][0]=tid+sep+sec;
		arguments[4]=paramString.replace(new RegExp('(here)?'+sep+sec),tid+sep+sec);
	}
	config.macros.tiddler.handler_section.apply(this,arguments);
}
//}}}
/***
!!!!sectionTOC macro
***/
//{{{
config.macros.sectionTOC = {
	targetClass: 'sectionTOC',
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var out=[];
		var targetClass=params[0]||this.targetClass;
		var t=story.findContainingTiddler(place); if (!t) return;
		var elems=t.getElementsByTagName('*');
		var level=5; // topmost heading level
		for (var i=0; i<elems.length; i++) {
			var txt=getPlainText(elems[i]).trim();
			var link='[['+txt+'|##'+txt+']]';
			switch(elems[i].nodeName) {
				case 'H1': out.push('#'+link);		level=1; break;
				case 'H2': out.push('##'+link);		level=level<2?level:2; break;
				case 'H3': out.push('###'+link);	level=level<3?level:3; break;
				case 'H4': out.push('####'+link);	level=level<4?level:4; break;
				case 'H5': out.push('#####'+link);	level=level<5?level:5; break;
				default: if (hasClass(elems[i],targetClass)) var target=elems[i];
			}
		}
		// trim excess bullet levels
		if (level>1) for (var i=0; i<out.length; i++) out[i]=out[i].substr(level-1);
		// show numbered list
		if (out.length && target) {
			if (target.style.display=='none') target.style.display='block';
			wikify(out.join('\n'),target);
		}
	}
}
//}}}
/***
!!!Invoke macro
{{{
<<sectionTOC>>
}}}
***/
// //<<sectionTOC>>
/***
|Name|SetIconPlugin|
|Source|http://www.TiddlyTools.com/#SetIconPlugin|
|Documentation|http://www.TiddlyTools.com/#SetIconPluginInfo|
|Version|1.8.0|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.3|
|Type|plugin|
|Requires||
|Overrides||
|Options|##Configuration|
|Description|add an image to a toolbar, macro, or slider link|
!!!!!Documentation
>see [[SetIconPluginInfo]]
!!!!!Configuration
<<<
<<option chkIconsShowImage>> show images on links
<<option chkIconsShowText>> include link text with images
default image style: {{stretch{<<option txtIconsCSS>>}}}
<<<
!!!!!Revisions
<<<
2008.05.11 [1.8.0] added optional 'notext' value for iconpos to force text to be hidden for specific links
| see [[SetIconPluginInfo]] for additional revision details |
2008.05.09 [1.0.0] initial release (as inline script)
<<<
!!!!!Code
***/
//{{{
version.extensions.SetIconPlugin= {major: 1, minor: 8, revision: 0, date: new Date(2008,5,11)};

if (config.options.chkIconsShowImage===undefined)
	config.options.chkIconsShowImage=true;
if (config.options.chkIconsShowText===undefined)
	config.options.chkIconsShowText=true;
if (config.options.txtIconsCSS===undefined)
	config.options.txtIconsCSS="vertical-align:middle;width:auto;height:auto";

config.macros.setIcon = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		if (!config.options.chkIconsShowImage) return; // text-only - do nothing
		if (!params[0]) return; // no image src specified - do nothing

		// find nearest link element
		var btn=place.lastChild; // look for sibling link
		while (btn && btn.nodeName!="A") btn=btn.previousSibling;
		if (!btn) { // look for child link
			var links=place.getElementsByTagName("A");
			if (links.length) btn=links[links.length-1];
		}
		if (!btn) { // look for parent link
			var btn=place.parentNode.lastChild;
			while (btn && btn.nodeName!="A") btn=btn.previousSibling;
		}
		if (!btn) { // look for cousin link
			var links=place.parentNode.getElementsByTagName("A");
			if (links.length) btn=links[links.length-1];
		}
		if (!btn) return; // can't find a link - do nothing

		// set icon and command text/tip
		var txt=btn.innerHTML;
		var src=params[0];  // default to direct URL
		if (config.macros.attach && config.macros.attach.isAttachment(src))
			src=config.macros.attach.getAttachment(src); // retrieve attachment (if any)
		var css=params[1]; if (!css||!css.length) css=config.options.txtIconsCSS;
		var after=params[2]&&params[2].toUpperCase()=="RIGHT";
		var notext=params[2]&&params[2].toUpperCase()=="NOTEXT";
		btn.innerHTML="<img src='"+src+"' style='"+css+"'>";
		if (config.options.chkIconsShowText && !notext)
			btn.innerHTML=after?txt+btn.innerHTML:btn.innerHTML+txt;
		else
			btn.title=txt.toUpperCase()+": "+btn.title; // add text to tooltip

		// adjust nested slider button text/tip
		if (btn.getAttribute("closedtext")!=null) {
			btn.setAttribute("closedtext",btn.innerHTML);
			btn.setAttribute("openedtext",btn.innerHTML);
			if (!config.options.chkIconsShowText || notext) {
				btn.setAttribute("closedtip",txt.toUpperCase()+": "+btn.getAttribute("closedtip"));
				btn.setAttribute("openedtip",txt.toUpperCase()+": "+btn.getAttribute("openedtip"));
			}
		}
	}
};
//}}}
/%
!info
|Name|SetStoryHeight|
|Source|http://www.TiddlyTools.com/#SetStoryHeight|
|Version|2.0.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|transclusion|
|Description|set a scrolling, fixed or percentage height for the central story|
Usage
<<<
{{{
<<tiddler SetStoryHeight>>
}}}
Try it:
<<tiddler SetStoryHeight##show>>
<<<
!end

!show
<<tiddler {{
	if (config.options.txtStoryHeight===undefined)
		config.options.txtStoryHeight='auto';
'';}}>>story height: {{smallform{<<option txtStoryHeight>><<tiddler {{
	var t=place.lastChild;
	t.style.width='4em'; t.style.textAlign='center';
	t.title='enter height using CSS px, em, in, cm, % or auto';
	t.onfocus=function(){this.select();};
	t.onblur=function(){this.onchange();};
	if (!t.coreOnChange) t.coreOnChange=t.onchange;
	t.onchange=function() { // hijack: update CSS when field changes
		if (this.coreOnChange) this.coreOnChange();
		window.setStoryHeight();
	};
	window.setStoryHeight=function() {
		var opt='txtStoryHeight';
		var h=config.options[opt]; if (!h.length) h='auto';
		if (!h.replace(/[0-9]*/,'').length) h+='px';
		config.macros.option.propagateOption(opt,'value',h,'input');
		if (h=='auto') removeCookie(opt);
		var top=findPosY(document.getElementById('tiddlerDisplay'));
		if (h.indexOf('%')!=-1)
			h=((findWindowHeight()-top)*parseInt(h.replace(/[%]/,''))/100)+'px';
		var heightParam=(config.browser.isIE?'height':'max-height')+':'+h;
		var overflowParam='overflow:'+(h!='auto'?'auto':'visible')+' !important'; 
		var css='#tiddlerDisplay { '+heightParam+'; '+overflowParam+'; }';
		setStylesheet(css,'storyHeightStyles');
	};
	if (window.addEventListener) // so % height can auto-adjust if window is resized
		window.addEventListener('resize',window.setStoryHeight,false);
	if (window.removeCookie===undefined) { // if not already defined by TW core...
		window.removeCookie=function(name) {
			document.cookie = name+'=; expires=Thu, 01-Jan-1970 00:00:01 UTC; path=/;'; 
		};
	}
'';}}>>
!end

%/<<tiddler {{var src='SetStoryHeight'; src+(tiddler&&tiddler.title==src?'##info':'##show');}}>>
/***
|Name|ShortcutKeysPlugin|
|Source|http://twkeys.tiddlyspace.com#ShortcutKeysPlugin|
|Version|1.0|
|Author|Jon Visick|
|License|none|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|ShortcutPlugin|
|Description|Allow use of shortcut keys during TW editing|
!!!!!Description
The plugins ShortcutKeysPlugin and ShortcutPlugin provide shortcut key functions for editing ~TiddlyWiki tiddlers.

ShortcutPlugin needs to be loaded for anything to happen; you do not need to edit this file. ShortcutKeysPlugin contains the definitions for the shortcut keys you wish to use and can be edited to suit your needs. By default, it includes basic TW editing shortcuts such as ~Ctrl+B for ''bold'', ~Ctrl+I for //italic//, ~Ctrl+U for __underline__, etc.
!!!!!Usage
A shortcut key definition looks like one of these three examples:
{{{
shortcut.add("Ctrl+I",function(){
  jQuery().insCursor("//")
  });

shortcut.add("Alt+8",function(){
  jQuery().insOne("&deg;")
  });

shortcut.add("Alt+I",function(){
  jQuery().insPair("[img[","]]")
  });
}}}

The key to be used goes in quotes right after the {{{shortcut.add(}}}. See list of key names below for keys that can be modified. Use a + to separate a modifier (Shift, Ctrl, Alt, Meta) from a key name.

The text that you want the key to insert into the editing area goes in quotes in the last set of parentheses. This is simply text, so it might be a ~TiddlyWiki formatter like {{{//}}} for italic, an HTML entity like {{{&alpha;}}} for the Greek letter alpha, or just a piece of text that you need to insert frequently, like {{{~TiddlyWiki}}}.

There are three ways the plugin can work; you need to specify the appropriate mode for each key you define:
#''insCursor'' means: //If no text is selected//, insert a __pair__ of the specified text at the cursor, but //if text is selected//, insert the specified text on both sides of the selected text. So, with the above definition, pressing {{{Ctrl+I}}} inserts {{{//}}} into the text at the cursor, but if the word "italicize" were selected, we'd get {{{//italicize//}}} with paired formatters. This is useful for inserting ~TiddlyWiki formatting like bold, italic, underline, links, etc. and could also be used for something like an HTML tag.
#''insOne'' means insert the specified text at the cursor. If text is selected, it will be replaced. This is useful for inserting HTML entities like special symbols, Greek letters, etc. and could also be used for un-paired ~TiddlyWiki formatters like {{{!!!}}} for a heading.
#''insPair'' means: //If no text is selected//, insert the __two__ specified text items at the cursor, but //if text is selected//, insert the first specified text before the selected text and the second after it. This is useful for some of the special ~TiddlyWiki formatters such as an image: with the definition shown above, one could select an image file name and the result would be {{{[img[image/file.name]]}}}.
!!!!!Keys
//Note: all key names are case-insensitive//
| Modifiers | Standard Keys | Special Keys |h
|shift<br>ctrl<br>alt<br>meta //(Mac only)//|~A-Z //(case-insensitive)//<br>0-9<br>punctuation:<br>  `~!@#$%^&*()-_=+;:'<br>  \,<.>/?{{{|}}}[]{}|f1-f12 (function keys)<br>esc //or// escape<br>tab<br>space<br>return //or// enter<br>backspace<br>scroll //or// scrolllock //or// scroll_lock<br>caps //or// capslock //or// caps_lock<br>num //or// numlock //or// num_lock<br>pause //or// break<br>insert<br>home<br>delete<br>end<br>pageup //or// page_up //or// pu<br>pagedown //or// page_down //or// pd<br>left<br>up<br>right<br>down|
!!!!!Code
***/
//{{{
shortcut.add("Ctrl+B",function(){  // Bold text: insert '' or paired formatters around ''selection''
  jQuery().insCursor("''")
  });
shortcut.add("Ctrl+I",function(){  // Italic text: insert // or paired formatters around //selection//
  jQuery().insCursor("//")
  });
shortcut.add("Ctrl+=",function(){  //  Subscript: insert ~~ or paired formatters around ~~selection~~
  jQuery().insCursor("~~")
  });
shortcut.add("Ctrl+Alt+=",function(){  //  Superscript: insert ^^ or paired formatters around ^^selection^^
  jQuery().insCursor("^^")
  });
shortcut.add("Ctrl+U",function(){  // Underline text: insert __ or paired formatters around __selection__
  jQuery().insCursor("__")
  });
shortcut.add("Alt+X",function(){  // Insert times symbol (HTML entity &times;) at cursor
  jQuery().insOne("&times;")
  });
shortcut.add("Alt+8",function(){  // Insert bullet symbol (HTML entity &bull;) at cursor
  jQuery().insOne("&bull; ")
  });
shortcut.add("Alt+.",function(){  //  Insert right arrow symbol (HTML entity &rarr;) at cursor
  jQuery().insOne("&rarr;")
  });
shortcut.add("Alt+B",function(){  //  Insert Greek letter beta (HTML entity &beta;) at cursor
  jQuery().insOne("&beta;")
  });
shortcut.add("Alt+A",function(){  //  Insert Greek letter alpha (HTML entity &alpha;) at cursor
  jQuery().insOne("&alpha;")
  });
shortcut.add("Alt+,",function(){  //  Insert left arrow symbol (HTML entity &larr;) at cursor
  jQuery().insOne("&larr;")
  });
shortcut.add("Alt+M",function(){  //  Insert Greek letter mu (HTML entity &mu;) at cursor
  jQuery().insOne("&mu;")
  });
shortcut.add("Ctrl+/",function(){  //  Insert line break (<br>) at cursor
  jQuery().insOne("<br>")
  });
shortcut.add("Alt+Shift+*",function(){  //  Insert degree symbol (HTML entity &deg;) at cursor
  jQuery().insOne("&deg;")
  });
shortcut.add("Alt+-",function(){  //  Insert em dash (HTML entity &mdash;) at cursor
  jQuery().insOne("&mdash;")
  });
shortcut.add("Alt+Shift+_",function(){  //  Insert en dash (HTML entity &ndash;) at cursor
  jQuery().insOne("&ndash;")
  });
shortcut.add("Ctrl+Alt+C",function(){  //  Insert checkbox ([ ]) at cursor (requires CheckboxPlugin from TiddlyTools to work)
  jQuery().insOne("[ ]")
  });
shortcut.add("Ctrl+L",function(){  //  Insert link formatter ([[ ]])
  jQuery().insPair("[[","]]")
  });
shortcut.add("Alt+L",function(){  //  Insert special formatter for external link
  jQuery().insPair("[L[","]]")
  });
shortcut.add("Alt+I",function(){  //  Insert image formatter ([img[ ]])
  jQuery().insPair("[img[","]]")
  });
shortcut.add("Ctrl+Alt+I",function(){  //  Insert captioned image formatter ([1>I[|]])
  jQuery().insPair("[1>I[","|]]")
  });
shortcut.add("Alt+G",function(){  //  Insert glossary entry formatter ([G[|]])
  jQuery().insPair("[G[","|]]")
  });
shortcut.add("Alt+T",function(){  //  Insert special formatter for topics in text
  jQuery().insPair("[T[","]]")
  });
//}}}
/***
|Name|ShortcutPlugin|
|Source|http://twkeys.tiddlyspace.com/#ShortcutPlugin|
|Version|1.0|
|Author|Jon Visick|
|License|Plugin is based on http://www.openjs.com/scripts/events/keyboard_shortcuts <br>Original shortcut script covered by BSD license|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Description|Allow use of shortcut keys during TW editing|
!!!!!Usage
Keys are defined in the [[ShortcutKeysPlugin]], which includes documentation.
!!!!!Credits
Source of shortcut script:
>http://www.openjs.com/scripts/events/keyboard_shortcuts/
>Version : 2.01.B
>By Binny V A
>License : BSD
!!!!!Code
***/
//{{{
shortcut = {
  'all_shortcuts':{},     //All the shortcuts are stored in this array
  'add': function (shortcut_combination,callback) {
           var ele = document;
           var ths = this;
           shortcut_combination = shortcut_combination.toLowerCase();
           //The function to be called at keypress
           var func = function(e) {
             e = e || window.event;
             var element;
             if ( e.target ) { element=e.target; }
               else if ( e.srcElement ) { element=e.srcElement; }
             if ( element.nodeType==3 ) { element=element.parentNode; }
             if ( element.tagName.toUpperCase() != 'TEXTAREA' ) { return; }
             //Find Which key is pressed
             if ( e.keyCode ) { code = e.keyCode; }
               else if ( e.which ) { code = e.which; }
             var character = String.fromCharCode(code).toLowerCase();
             if ( code == 188 ) { character = ","; }   //If the user presses , when the type is onkeydown
             if ( code == 190 ) { character="."; }  //If the user presses , when the type is onkeydown
             var keys = shortcut_combination.split("+");
             //Counts valid keypresses - if same as number of keys, shortcut function invoked
             var kp = 0;
             //workaround for broken shift+num combination created by using lowercase
             var shift_nums = { "`":"~", "1":"!", "2":"@", "3":"#", "4":"$", "5":"%", "6":"^",
                                "7":"&", "8":"*", "9":"(", "0":")", "-":"_", "=":"+", ";":":",
                                "'":"\"", ",":"<", ".":">", "/":"?", "\\":"|"
                                }
             //Special Keys - and their codes
             var special_keys = { 'esc':27, 'escape':27,
                                  'tab':9,
                                  'space':32,
                                  'return':13, 'enter':13,
                                  'backspace':8,
                                  'scrolllock':145, 'scroll_lock':145, 'scroll':145,
                                  'capslock':20, 'caps_lock':20, 'caps':20,
                                  'numlock':144, 'num_lock':144, 'num':144,
                                  'pause':19, 'break':19,
                                  'insert':45,
                                  'home':36,
                                  'delete':46,
                                  'end':35,
                                  'pageup':33, 'page_up':33, 'pu':33,
                                  'pagedown':34, 'page_down':34, 'pd':34,
                                  'left':37,
                                  'up':38,
                                  'right':39,
                                  'down':40,
                                  'f1':112, 'f2':113, 'f3':114, 'f4':115, 'f5':116, 'f6':117,
                                  'f7':118, 'f8':119, 'f9':120, 'f10':121, 'f11':122, 'f12':123
                                  }
             var modifiers = { shift: { wanted:false, pressed:false},
                               ctrl : { wanted:false, pressed:false},
                               alt  : { wanted:false, pressed:false},
                               meta : { wanted:false, pressed:false}  //Meta is Mac specific
                               };
             if ( e.ctrlKey ) { modifiers.ctrl.pressed = true; }
             if ( e.shiftKey ) { modifiers.shift.pressed = true; }
             if ( e.altKey ) { modifiers.alt.pressed = true; }
             if ( e.metaKey ) { modifiers.meta.pressed = true; }
             for ( var i=0; k=keys[i],i<keys.length; i++ ) {
               //Modifiers
               if ( k == 'ctrl' || k == 'control' ) { kp++; modifiers.ctrl.wanted = true; }
                 else if ( k.toLowerCase() == 'shift' ) { kp++; modifiers.shift.wanted = true; }
                 else if ( k == 'alt' ) { kp++; modifiers.alt.wanted = true; }
                 else if ( k == 'meta' ) {kp++; modifiers.meta.wanted = true; }
               //Special keys
                 else if ( k.length > 1 ) { if(special_keys[k] == code) { kp++; } }
               //Normal key, or special keys did not match
                 else {
                   if ( character == k ) { kp++; }
                     else {
                       if ( shift_nums[character] && e.shiftKey ) {  //deals with shift+num problem
                         character = shift_nums[character]; 
                         if(character == k) { kp++; }
                         }
                     }
                 }
               }
             if( kp == keys.length && modifiers.ctrl.pressed == modifiers.ctrl.wanted &&
                                      modifiers.shift.pressed == modifiers.shift.wanted &&
                                      modifiers.alt.pressed == modifiers.alt.wanted &&
                                      modifiers.meta.pressed == modifiers.meta.wanted ) {
               callback(e);
               //Stop the event for IE
               e.cancelBubble = true;
               e.returnValue = false;
               //Stop the event for Firefox.
               if (e.stopPropagation) { e.stopPropagation(); e.preventDefault(); }
               return false;
               }
             }
           this.all_shortcuts[shortcut_combination] = { 'callback':func, 'target':ele, 'event': 'keypress' };
           //Attach the function with the event
           if ( ele.addEventListener ) { ele.addEventListener('keypress', func, false); }
             else if ( ele.attachEvent ) { ele.attachEvent('onkeypress', func); }
             else { ele['onkeypress'] = func; }
           }
  }

// Function to insert paired text at cursor OR insert pair around selected text
jQuery.fn.extend({
  insCursor: function(insText){
    var domEl = jQuery('textarea').get(0);
    var sp = domEl.scrollTop;
    var cStart = domEl.selectionStart;
    var cEnd = domEl.selectionEnd;
    var cAdd = cEnd + insText.length;
    var newText = domEl.value.substring(0,cStart) + insText;
    if (cStart != cEnd)
      { newText += domEl.value.substring(cStart,cEnd)
        if ( newText.substr(newText.length-1,1) == " " ) {
          newText = newText.substr(0,newText.length-1) + insText + " ";
          }
        else { newText += insText; }
        cAdd += insText.length;
        }
    newText += domEl.value.substring(cEnd);
    domEl.value = newText;
    domEl.setSelectionRange(cAdd,cAdd);
    domEl.focus();
    domEl.scrollTop = sp;
}})

// Function to insert text at cursor
jQuery.fn.extend({
  insOne: function(insText){
    var domEl = jQuery('textarea').get(0);
    var sp = domEl.scrollTop;
    var cStart = domEl.selectionStart;
    var cEnd = domEl.selectionEnd;
    var cAdd = cEnd + insText.length;
    var newText = domEl.value.substring(0,cStart) + insText;
    newText += domEl.value.substring(cEnd);
    domEl.value = newText;
    domEl.setSelectionRange(cAdd,cAdd);
    domEl.focus();
    domEl.scrollTop = sp;
}})

// Function to insert two distinct text items at cursor or around selected text
jQuery.fn.extend({
  insPair: function(insTextA,insTextB){
    var domEl = jQuery('textarea').get(0);
    var sp = domEl.scrollTop;
    var cStart = domEl.selectionStart;
    var cEnd = domEl.selectionEnd;
    var cAdd = cEnd + insTextA.length;
    var newText = domEl.value.substring(0,cStart) + insTextA;
    if (cStart != cEnd) { 
      newText += domEl.value.substring(cStart,cEnd) + insTextB;
      cAdd = cAdd  + insTextB.length;
      }
    else { newText += insTextB; }
    newText += domEl.value.substring(cEnd);
    domEl.value = newText;
    domEl.setSelectionRange(cAdd,cAdd);
    domEl.focus();
    domEl.scrollTop = sp;
}})
//}}}
<<closeAll>><<permaview>><<newTiddler>><<newJournal "DD MMM YYYY" "journal">><<saveChanges>><<slider chkSliderOptionsPanel OptionsPanel "options »" "Change TiddlyWiki advanced options">>
<<tabs txtMainTab "Timeline" "Timeline" TabTimeline "All" "All tiddlers" TabAll "Tags" "All tags" TabTags "More" "More lists" TabMore>>
/***
|Name|SinglePageModePlugin|
|Source|http://www.TiddlyTools.com/#SinglePageModePlugin|
|Documentation|http://www.TiddlyTools.com/#SinglePageModePluginInfo|
|Version|2.9.7|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|Show tiddlers one at a time with automatic permalink, or always open tiddlers at top/bottom of page.|
This plugin allows you to configure TiddlyWiki to navigate more like a traditional multipage web site with only one tiddler displayed at a time.
!!!!!Documentation
>see [[SinglePageModePluginInfo]]
!!!!!Configuration
<<<

Notes:
* The "display one tiddler at a time" option can also be //temporarily// set/reset by including a 'paramifier' in the document URL: {{{#SPM:true}}} or {{{#SPM:false}}}.
* If more than one display mode is selected, 'one at a time' display takes precedence over both 'top' and 'bottom' settings, and if 'one at a time' setting is not used, 'top of page' takes precedence over 'bottom of page'.
* When using Apple's Safari browser, automatically setting the permalink causes an error and is disabled.
<<<
!!!!!Revisions
<<<
2010.11.30 2.9.7 use story.getTiddler()
2008.10.17 2.9.6 changed chkSinglePageAutoScroll default to false
| Please see [[SinglePageModePluginInfo]] for previous revision details |
2005.08.15 1.0.0 Initial Release.  Support for BACK/FORWARD buttons adapted from code developed by Clint Checketts.
<<<
!!!!!Code
***/
//{{{
version.extensions.SinglePageModePlugin= {major: 2, minor: 9, revision: 7, date: new Date(2010,11,30)};
//}}}
//{{{
config.paramifiers.SPM = { onstart: function(v) {
	config.options.chkSinglePageMode=eval(v);
	if (config.options.chkSinglePageMode && config.options.chkSinglePagePermalink && !config.browser.isSafari) {
		config.lastURL = window.location.hash;
		if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);
	}
} };
//}}}
//{{{
if (config.options.chkSinglePageMode==undefined)
	config.options.chkSinglePageMode=false;
if (config.options.chkSinglePagePermalink==undefined)
	config.options.chkSinglePagePermalink=true;
if (config.options.chkSinglePageKeepFoldedTiddlers==undefined)
	config.options.chkSinglePageKeepFoldedTiddlers=false;
if (config.options.chkSinglePageKeepEditedTiddlers==undefined)
	config.options.chkSinglePageKeepEditedTiddlers=false;
if (config.options.chkTopOfPageMode==undefined)
	config.options.chkTopOfPageMode=false;
if (config.options.chkBottomOfPageMode==undefined)
	config.options.chkBottomOfPageMode=false;
if (config.options.chkSinglePageAutoScroll==undefined)
	config.options.chkSinglePageAutoScroll=false;
//}}}
//{{{
config.SPMTimer = 0;
config.lastURL = window.location.hash;
function checkLastURL()
{
	if (!config.options.chkSinglePageMode)
		{ window.clearInterval(config.SPMTimer); config.SPMTimer=0; return; }
	if (config.lastURL == window.location.hash) return; // no change in hash
	var tids=decodeURIComponent(window.location.hash.substr(1)).readBracketedList();
	if (tids.length==1) // permalink (single tiddler in URL)
		story.displayTiddler(null,tids[0]);
	else { // restore permaview or default view
		config.lastURL = window.location.hash;
		if (!tids.length) tids=store.getTiddlerText("DefaultTiddlers").readBracketedList();
		story.closeAllTiddlers();
		story.displayTiddlers(null,tids);
	}
}


if (Story.prototype.SPM_coreDisplayTiddler==undefined)
	Story.prototype.SPM_coreDisplayTiddler=Story.prototype.displayTiddler;
Story.prototype.displayTiddler = function(srcElement,tiddler,template,animate,slowly)
{
	var title=(tiddler instanceof Tiddler)?tiddler.title:tiddler;
	var tiddlerElem=story.getTiddler(title); // ==null unless tiddler is already displayed
	var opt=config.options;
	var single=opt.chkSinglePageMode && !startingUp;
	var top=opt.chkTopOfPageMode && !startingUp;
	var bottom=opt.chkBottomOfPageMode && !startingUp;
	if (single) {
		story.forEachTiddler(function(tid,elem) {
			// skip current tiddler and, optionally, tiddlers that are folded.
			if (	tid==title
				|| (opt.chkSinglePageKeepFoldedTiddlers && elem.getAttribute("folded")=="true"))
				return;
			// if a tiddler is being edited, ask before closing
			if (elem.getAttribute("dirty")=="true") {
				if (opt.chkSinglePageKeepEditedTiddlers) return;
				// if tiddler to be displayed is already shown, then leave active tiddler editor as is
				// (occurs when switching between view and edit modes)
				if (tiddlerElem) return;
				// otherwise, ask for permission
				var msg="'"+tid+"' is currently being edited.\n\n";
				msg+="Press OK to save and close this tiddler\nor press Cancel to leave it opened";
				if (!confirm(msg)) return; else story.saveTiddler(tid);
			}
			story.closeTiddler(tid);
		});
	}
	else if (top)
		arguments[0]=null;
	else if (bottom)
		arguments[0]="bottom";
	if (single && opt.chkSinglePagePermalink && !config.browser.isSafari) {
		window.location.hash = encodeURIComponent(String.encodeTiddlyLink(title));
		config.lastURL = window.location.hash;
		document.title = wikifyPlain("SiteTitle") + " - " + title;
		if (!config.SPMTimer) config.SPMTimer=window.setInterval(function() {checkLastURL();},1000);
	}
	if (tiddlerElem && tiddlerElem.getAttribute("dirty")=="true") { // editing... move tiddler without re-rendering
		var isTopTiddler=(tiddlerElem.previousSibling==null);
		if (!isTopTiddler && (single || top))
			tiddlerElem.parentNode.insertBefore(tiddlerElem,tiddlerElem.parentNode.firstChild);
		else if (bottom)
			tiddlerElem.parentNode.insertBefore(tiddlerElem,null);
		else this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler
	} else
		this.SPM_coreDisplayTiddler.apply(this,arguments); // let CORE render tiddler
	var tiddlerElem=story.getTiddler(title);
	if (tiddlerElem&&opt.chkSinglePageAutoScroll) {
		// scroll to top of page or top of tiddler
		var isTopTiddler=(tiddlerElem.previousSibling==null);
		var yPos=isTopTiddler?0:ensureVisible(tiddlerElem);
		// if animating, defer scroll until after animation completes
		var delay=opt.chkAnimate?config.animDuration+10:0;
		setTimeout("window.scrollTo(0,"+yPos+")",delay); 
	}
}

if (Story.prototype.SPM_coreDisplayTiddlers==undefined)
	Story.prototype.SPM_coreDisplayTiddlers=Story.prototype.displayTiddlers;
Story.prototype.displayTiddlers = function() {
	// suspend single/top/bottom modes when showing multiple tiddlers
	var opt=config.options;
	var saveSPM=opt.chkSinglePageMode; // opt.chkSinglePageMode=false;
	var saveTPM=opt.chkTopOfPageMode; opt.chkTopOfPageMode=false;
	var saveBPM=opt.chkBottomOfPageMode; opt.chkBottomOfPageMode=false;
	this.SPM_coreDisplayTiddlers.apply(this,arguments);
	opt.chkBottomOfPageMode=saveBPM;
	opt.chkTopOfPageMode=saveTPM;
	opt.chkSinglePageMode=saveSPM;
}
//}}}
the laboratory of ''Jonathan E. Visick, PhD'' • [[Dept. of Biology|http://www.noctrl.edu/majors/biology]] • [[North Central College|http://www.noctrl.edu]] • Naperville, IL 60540 • (630) 637-5185 • [[jevisick@noctrl.edu|mailto:jevisick@noctrl.edu]]
Protein Repair in Aging //E. coli//
A grant proposal usually includes a "Specific Aims" page, in which the experimental goals are laid out in brief. Each "Aim" is a specific part of the experimental approach to the problem. This page is taken from the Specific Aims of our most recent NIH grant proposal. As a student in the lab, you would likely be working on one sub-aim: e.g., 1A, 2B, etc. More detail about how the projects will be carried out is given on the [[Projects]] pages.
!!Aim 1: How does PCM enhance survival of aging //E. coli//?
We have shown that PCM increases the ability of //E. coli// to survive environmental challenges during long-term stationary phase. Possible mechanisms for this effect could include repair of damaged active-site residues, facilitation of protein degradation, maintenance of a few key enzymes, etc. Based on our finding that aging //pcm// mutants are impaired in survival of denaturing stresses, we will test the hypothesis that isoAsp damage has a synergistic effect in combination with oxidative or other stresses, destabilizing the conformation of cellular proteins or inhibiting their re-folding once unfolded.

''Aim 1A: Dissect the relationship of PCM with other protein-maintenance factors''. Using a genetic approach, we will identify PCM's "partners" in maintenance of protein conformation by looking for:
*intensified phenotypes when a pcm mutation is combined with mutations affecting chaperons, proteases and other stress-response proteins
*suppression of pcm phenotypes when protein-maintenance factors are overexpressed.

''Aim 1B: Probe protein conformation //in vivo//''. Biochemical and molecular approaches will be used to determine how PCM affects protein aggregation, protein oxidation and the folding of potential PCM substrates and conformationally unstable proteins //in vivo//.
!!Aim 2: When and where does PCM exert its effect?
Most investigators have assumed that PCM permits repair of proteins when turnover is limited&mdash;such as in erythrocytes, seeds or quiescent stationary-phase //E. coli//. Our recently published data suggest a new hypothesis: PCM is advantageous primarily __after__ restoration of nutrients allows aged //E. coli// cultures to resume metabolic activity, as well as for subpopulations that are active at any given point during long-term stationary phase.

''Aim 2A: Determine when and where PCM repairs damage in stationary-phase //E. coli//''. We will separate viable from inviable stationary-phase cells and examine the ability of each to repair isoAsp damage //in vivo// and determine whether suitable conditions exist for PCM-mediated repair at various points during long-term stationary phase and recovery. We will also test the alternative hypothesis that the effect of PCM may be spatially rather than temporally constrained.

''Aim 2B: Separate protein aging from starvation in a novel model system''. Using //E. coli//'s RelE/RelB toxin-antitoxin system, we will induce stasis by blocking //de novo// protein synthesis prior to nutrient exhaustion. We can thus determine whether cells that can generate energy and synthesize cofactors will also be able to prevent isoAsp accumulation, unlike their starving stationary-phase counterparts.
// // Be sure Main Menu and Search/Login box will display correctly
//{{{
var labelText = "{{menuTitle{Main Menu}}}\n{{menuText{\n";
store.setValue("MainMenu","text",labelText + store.getValue("PubMenuStore","text") + "\n}}}");
store.setValue("cornerBox","text",store.getValue("loginBoxStore","text"));
config.options.loggedIn = false;
config.options.chkSinglePageMode = true;
//}}}

// // Set height to eliminate outer scrollbar;
//{{{
window.setHeight = function () {
  var setHeight = findWindowHeight() - 80 - 30;
  var viewHeight = setHeight - 80;
  var css = '#tiddlerDisplay { height: ' + setHeight + 'px !important; max-height: ' + setHeight + 'px !important; overflow: auto; }\n';
  css += '#mainMenu { height: ' + setHeight + 'px !important; max-height: ' + setHeight + 'px !important; overflow: hide; }\n';
  css += 'div.viewer { max-height: ' + viewHeight + 'px !important; overflow: auto; }';
  setStylesheet(css,'scrollStyles');
  };

window.setHeight();
if (window.addEventListener) { // so height can auto-adjust if window is resized
  window.addEventListener('resize',window.setHeight,false);
  }
//}}}

// // Set tooltip for links to be just title of linked page (see CoreTweaks #637)
//{{{
config.options.txtTiddlerLinkTooltip='%0';
Tiddler.prototype.getSubtitle = function() {
  return config.options.txtTiddlerLinkTooltip.format([this.title]);
};
//}}}
/*{{{*/

/*Includes*/
[[Fonts]]

/*Toolbar*/
.toolbar { position: relative; float: right; margin-top: 8px; margin-right: 1px; z-index: 2;}
.toolbar a.button { border: none; padding: 0; display: block; height: 16px; width: 16px; float: left; margin-left: 1px; margin-right: 1px;}
.toolbar a.button:hover { background: #eee; }
.toolbarImg { vertical-align: middle; cursor: pointer; }

/*Formatting styles*/
.smbutton a { background-color: #ccc; border: 1px solid #666; color: navy; text-decoration: none; height: 14px; font-size: 12px; padding: 2px; -moz-border-radius: 3px; }
.smbutton a:hover { background-color: #eee; }

/*Reference display*/
table.reftable {width: 100%; border: none; }
td.leftstuff { align: left; }
td.rightstuff { width: 34px; align: right; }
.toolbox { margin: 0 0 8px 0; }
.toolbox a.button { border: none; padding: 0; display: block; height: 32px; width: 32px; margin: 0 1px 2px auto; }
.toolbox a.button:hover { background-color: #fff; }
.reftitle { background-color: #fff; padding: 12px 12px 6px 37px; text-indent: -25px; text-align: left; font-family: 'Trebuchet MS',sans-serif; font-size: 17px; color: #666; }
.abstract { display: block; border: 1px solid #ccc; padding: 4px; font-family: Times,'Times New Roman', serif; font-size: 11pt; line-height: 13pt; margin: 10px 12px; height: 150px; overflow: auto; padding: 8px; }
.refdetails { color: #333; margin: 2px 20px 12px 20px; border-top: 1px solid #999; padding: 10px 15px 2px 15px; }
.topborder { background-color: #ddd; height: 10px; }
.refedit, .refedit fieldset { display: inline; }
.refedit select, .refedit textarea, .reffield input { border: 1px solid #ccc; background-color: #fff; vertical-align: text-top;  }
.refedit select { margin-bottom: 4px; height: 18 px; padding: 1px 2px; }
.refedit textarea { font-family: Arial,Helvetica,sans-serif; font-size: 9pt; width: 300px; padding-left: 4px; }
.reffield input { width: 100px; }
.tfoot { padding: 0 0 0 35px; width: 300px; margin-bottom: 8px; }
.showMore a, .showLess a { border: none; color: navy; }
.showMore a:hover, .showLess a:hover { background-color: #eee; border: none; }
.showLess, .fullCite { display: none; }
.mbs { margin: 6px 0 6px 12px; width: 75px; }
.fullCite { margin: 0 12px 6px 12px; border: 1px solid #ccc; padding: 6px; }
.fullCite span { display: block; margin: 0 0 6px 0; }
.aform { display: none; padding-left: 50px; }
div[tags~="notes"].tiddler .viewer strong { color: maroon; font-weight: normal; }

/*Tables and lists*/
#filterButton { cursor: pointer; margin-left: 15px; position: relative; top: -3px;}
.filterBar { display: block; position: relative; top: -28px; left: 150px; z-index: 0; }
#filter { width: 100px; }
.filterForm { font-size: 11px; margin-top: 6px; }
.filterForm input[type=checkbox] { margin: 0 6px 0 15px; }
.listtable thead td { background: #999; font-weight: bold; text-align: center; }
.listtable td:first-child { white-space: nowrap; }
.listtable td { padding: 2px 5px 3px 3px; }
.listtable td.iconCell { margin: 0; padding: 0 1px 0 0; }
.listtable td.iconCell a { display: block; margin: auto 1px auto 0; border: 1px transparent; height: 16px; width: 16px; }
.listtable td.iconCell a:hover { background: transparent; }
.listtable thead td, .listtable td { border-left: 0 none !important; border-right: 0 none !important; }

/*Topic display styles*/
.topicButton, .topicMark { color: maroon; font-weight: normal; text-decoration: none; font-size: 9px; background: #eee; margin-right: 4px; }
.topicButton:hover { background-color: #fff; color: blue; border: 1px solid blue; }
#tiddlerTopics table, #tiddlerTopics td, #tiddlerTopics tr { border: none; }
#tiddlerTopics tr { border-bottom: 1px solid #ccc; }
#tiddlerTopics tr:last-child { border-bottom: none; }
#tiddlerTopics td a.button { color: maroon; font-weight: normal; border: none; background: transparent; }
#tiddlerTopics td:first-child a.button { color: #666; font-weight: bold; border: none; background: transparent; }
#tiddlerTopics td:first-child { white-space: nowrap; }
.topicTopborder { background-color: #ddd; height: 16px; }
.topicTitle { font-family: 'Trebuchet MS',sans-serif; font-size: 32px; color: maroon; padding-left: 15px; padding-top: 3px; }
#tiddlerTopicPage h2 { color: maroon; font-weight: normal; border-bottom: 1px solid #999; padding-left: 6px; margin-bottom: 8px; }
#tiddlerTopicPage ul { list-style-type: square; margin-top: 0; }
#tiddlerTopicPage ul li { line-height: 16px; margin-bottom: 3px; }
.scrollList { height: 300px; overflow: auto; }

/*Edit template styles*/
.FormGroup { padding: 12px; margin: 6px 12px; border: 1px solid #ccc; }
.FormLabel { margin-bottom: 6px; padding: 0 4px 6px 0; color: #999; font-size:1.1em; display: inline; }
.FormEdit input { padding: 2px; margin: 0 6px 6px 0; border: 1px solid #ccc; display: inline; width: 70px; font-size: 1em; height: 14px; }
.FormEdit textarea {border: 1px solid #ccc; width: 100%; display: inline;}
.FormEdit select {border: 1px solid #ccc; padding: 2px; margin: 0 6px 0 0; display: inline; }
.mini input { width: 25px; }
.maxi input { width: 150px; }
.mega input { width: 500px; }

/*Search*/
#searchPanel,#orderPanel { width: 450px; background: #eee; border: 1px solid #333; -moz-border-radius: 6px; color: #333; text-align: left; position: fixed; top: 120px; right: 30px; padding: 6px 12px; z-index: 100; }
.formPanel input { height: 14px; font-size: 12px; border: 1px solid #ccc; background-color: white; margin: 2px; }
.formPanel input[type=radio] { vertical-align: middle; margin: 2px 3px 0 8px; }
.formPanel input[type=checkbox] { vertical-align: middle; margin: 0 3px 0 8px; }
.formPanel .sButton { height: 16px; font-size: 11px; border: 1px solid #666; background-color: #ccc; -moz-border-radius: 3px; margin: 2px; margin-top: 5px; padding-bottom: 1px; }
.formPanel .submitButtons { text-align: right; }
.formPanel .stitle { color: navy; margin-bottom: 8px; margin-top: 0; border-bottom: 1px solid #ccc; padding-bottom: 2px; }
.formPanel div { margin-top: 8px; }
.formPanel select { height: 16px; font-size: 10px; border: 1px solid #ccc; background-color: white; margin: 2px; }
.formPanel textarea { vertical-align: texttop; height: 18px; }

/*Clean layout for printing*/
@media print  {
  .header {display: none !important;}
  .toolbar {display: none !important;}
  .tagged {display: none !important;}
  .viewer {width: 100% !important; margin: 0 !important; padding: 0 !important; }
  #tiddlerDisplay {width: 95% !important; margin: 0 !important; padding: 0 !important; }
  #displayArea { margin: 1em !important; } 
  .tiddler {width: 100% !important; margin: 0 !important; padding: 0 !important; height: auto; overflow-y: visible;}
  #tiddlersBar {display: none !important; }
  .iPage { display: inline; border: none; page-break-before: always; width: 7.5 in; height: 10 in; }
}

/*Added/updated since copy of reference TW*/

/*Styles for basic TW features*/
body { background: white; }
.header { background-color: #eee; height: 80px; border-bottom: 1px #999; }
.siteTitle { margin-left: 75px; color: maroon; margin-top: 8px; }
.siteSubtitle { background: transparent; color: white; padding: 3px 6px 0 6px; display: block; margin: 6px 50px 0 75px; border-top: 1px solid #ccc; font-size: 12px; }
.siteSubtitle a { text-decoration: none; color: white; font-weight: normal; }
.siteSubtitle a:hover { color: yellow; }
.logo { display: inline-block; float: left; padding-left: 10px; padding-top: 1px; }
#displayArea { margin: 0 !important; }

/*Message area*/
#messageArea { font-size: 10px; background: transparent; position: absolute; top: 73px; right: 10px; border: none; width: 130px; padding: 2px; }
#messageArea a { color: wheat; text-decoration: none; }
.messageToolbar a.button { display: none; }

#mainMenu { background-color: #ccc; border: 1px solid white; text-align: left; padding: 0 0 4px 0; line-height: 13px; width: 147px !important; margin-left: 1px; margin-top: 1px; }
#mainMenu .button { border: none; color: black; }
#mainMenu a { color: black; font-size: 11px; text-decoration: none; }
#mainMenu ul { list-style-type: none; margin: 0; padding: 0; }
#mainMenu li { margin: 0; padding: 0; margin-bottom: 2px; }
.menuTitle { background-color: #666; border-bottom: 1px solid white; color: white; text-align: center; margin: 0; padding: 3px; display: block; }
.menuText { padding-left: 4px; padding-right: 2px; }
.menuBtn { position: relative; float: left; z-index: 200; border: 1px solid #666 !important; width: 75px; height: 16px; background-color: #999; text-align: center; margin-right: 3px; cursor: pointer; color: white; font-family: Helvetica,Arial,sans-serif; font-size: 12px; }
.menuBtn:hover { color: maroon; background-color: #666; border: 1px solid maroon !important; }
.mHead { color: maroon; padding-bottom: 3px; font-size: 11px; display: inline-block; }

/*Tiddler*/
.tiddler { background: #ddd; margin: 0 2px 0 0; padding:0; border: 1px solid #999; }
#tiddlerDisplay { margin: 3px 5px 0 153px;  border: none; background-color: white; }
.addMargin { margin-top: 5px !important; }
.title { border:none; border-bottom: 1px solid #b7bdc5; padding-bottom: 4px; background-color: #ccc; font-weight: normal; height: 36px; font-family: AvantGarde,'Trebuchet MS',Verdana,sans-serif; font-size: 28px; color: #333; padding: 8px 4px 4px 12px; }
.titleIcon { height: 24px; margin-right: 6px; }
.editor { padding: 3px 12px 12px 12px; }
.viewer { border: none; padding: 12px 18px; background-color: white; }
.tagged { display: none; }
.subtitle { display: none; }

/*Specific to tiddlers tagged "text"*/
div[tags~=text] .viewer { font-family: ZapfHumanist,Georgia,Times,TimesNewRoman,serif; font-size: 16px; line-height: 18px; }
.viewer pre { background: #eef; border: none; padding: 12px 20px; margin: 0; font-size: 12px; text-indent: 0; line-height: 1.2;}
div[tags~=text] .viewer strong { font-family: Tahoma,Verdana,Helvetica,Arial,sans-serif; font-size: 18px; font-weight: normal; }
div[tags~=text] .viewer ul { margin-top: 8px; list-style-type: square; }
div[tags~=text] .viewer ol { margin-top: 8px; list-style-position: inside; }
div[tags~=text] .viewer ol li { margin-bottom: 2px; }
div[tags~=text] .viewer a { color: #333; text-decoration: none; border-bottom: 1px dotted #333; font-weight: normal; }
div[tags~=text] .viewer a.imageLink { border: none !important; }
div[tags~=text] .viewer a:hover { color: maroon; background-color: #ccc; border-bottom: none; }
div[tags~=text] .viewer blockquote { margin-top: 8px; margin-bottom: 8px; line-height: 1.2; }
div[tags~=text] .viewer h2, div[tags~=project] .viewer h2 { border: none; }

/*Specific to tiddlers tagged "project"*/
div[tags~=project] .viewer blockquote { border: none; margin: 12px 20px; }

/*Specific to tiddlers tagged "protocol"*/
div[tags~=protocol] .viewer blockquote { border: none; margin: 3px 20px; font-style: italic; }

/*Tiddlers Bar*/
#tiddlersBar { margin-left: 146px; padding: 9px 6px 0 6px; height: 14px; }
#tiddlersBar .button { border: 0; }
#tiddlersBar .tab { white-space:nowrap; border: 1px solid #999; -moz-border-radius-topleft: 6px; -moz-border-radius-topright: 6px; }
#tiddlersBar .tabSelected, #tiddlersBar .tabUnselected { padding-left: 6px; padding-right: 3px; }
#tiddlersBar .tabSelected { border: 1px solid #999; border-bottom: 1px solid #ccc; background-color: #ccc;}
#tiddlersBar .tabSelected .button { color: maroon; }
#tiddlersBar .tabUnselected { background-color: #bbb; border: 1px solid #999; }
#tiddlersBar .tabUnselected .tabButton, .tabSelected .tabButton { padding : 0 3px 3px 3px; margin: 0 0 0 4px;}

/*Forms and buttons*/
.searchField { border: 1px solid #999; background: #eee; width: 100px; height: 15px; vertical-align: middle; margin-bottom: 2px; margin-left: 8px;}
.searchBox { position: absolute; right: 25px; top: 15px; }
a.searchButton { background: #ccc; border: 1px solid #999; height: 12px; color: black; font-size: 10px; padding: 1px; }
.logButton { background: #ccf; border: 1px solid #999; height: 17px; vertical-align: bottom; color: navy; font-size: 10px; padding: 1px; -moz-border-radius-topright: 4px; -moz-border-radius-bottomright: 4px; border-left: none; cursor: pointer; }
.logForm { display: inline; }
.logField { border: 1px solid #999; background: #fff; width: 75px; height: 13px; font-size: 10px; vertical-align: middle; -moz-border-radius-topleft: 4px; -moz-border-radius-bottomleft: 4px; border-right: none; }

/*Images with caption*/
.imgWrap { border: 1px solid #666; padding: 2px; margin: 3px auto 3px auto; }
.imgWrap br { margin-bottom: 0 !important; }
.iRight { float: right; margin-left: 6px; margin-right: 0; display: inline-block; }
.iLeft { float: left; margin-right: 6px; margin-left: 0;  display: inline-block; }
.iNoBord { border: none !important; }
.iCap { text-align: center; font-family: Helvetica,Calibri,Arial,sans-serif; font-size: 11px; color: #333; line-height: 11px; }

/*Footnotes*/
.ftnlink { font-family: 'Lucida Sans Unicode','Lucida Grande',Helvetica,Arial,sans-serif !important; font-size: 10px !important; color: maroon !important; font-weight: normal; vertical-align: super;  border: none !important; }
.ftnlist { list-style-type: lower-alpha; margin-top: 0; }
.footnote { color: midnightblue; font-size: 10px; font-family: Helvetica,Calibri,Arial,sans-serif; line-height: 11px; }
.footnoteholder { color: midnightblue; font-size: 12px; font-family: Helvetica,Calibri,Arial,sans-serif; border-top: 1px dotted #bbb; margin-top: 6px; padding-top: 6px; }
.nimg { margin-right: 3px; }

.reflink { font-family: Helvetica,Arial,sans-serif !important; font-size: 8px !important; color: maroon !important; background: url("icons/refIcon.png") no-repeat scroll left 2px; text-align: center; display: inline-block; width: 12px; height: 16px; margin-left: 2px; padding-right: 1px; border: none !important; font-weight: bold !important; vertical-align: text-top; }
.reflist { list-style-type: decimal; margin-top: 0; }
.reference { color: midnightblue; font-size: 10px; font-family: Helvetica,Calibri,Arial,sans-serif; line-height: 11px; }
.rftxt { color: midnightblue !important; text-decoration: none !important; border: none !important; }
.rftxt:hover { backround-color: #ccc; }
.refholder { color: midnightblue; font-size: 12px; font-family: Helvetica,Calibri,Arial,sans-serif; border-top: 1px dotted #bbb; margin-top: 6px; padding-top: 6px; }
.rimg { margin-right: 3px; }
.refbklink { border: none !important; }

/*Linkout links*/
.linkout { display: inline-block; font-weight: normal; background: url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAoAAAAKCAYAAACNMs+9AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAFZJREFUeF59z4EJADEIQ1F36k7u5E7ZKXeUQPACJ3wK7UNokVxVk9kHnQH7bY9hbDyDhNXgjpRLqFlo4M2GgfyJHhjq8V4agfrgPQX3JtJQGbofmCHgA/nAKks+JAjFAAAAAElFTkSuQmCC") no-repeat scroll center center transparent; width: 12px; height: 12px; margin-left: 3px; border: none !important; }

/*Glossary*/
.glossPop { position: absolute; border: 1px solid #ccc; background-color: white; color: navy; font-family: Helvetica,Callibri,Arial,sans-serif; font-size: 11px; line-height: 13px; padding: 8px; margin-left: 10px; margin-right: 10px; max-width:15em; width:expression(document.body.clientWidth > (255/12) * parseInt(document.body.currentStyle.fontSize)?'15em':'auto' );}
.glossPop h1, .glossPop h2 { margin-top: 0; color: navy; font-weight: normal; }
.glossText { color: #600; }
.glossLink { background: url("icons/tinyi.png") no-repeat scroll center center transparent; display: inline-block; width: 12px; height: 12px; margin-left: 2px;}
.glossSubOver { z-index: 225; background-color: #DFDFFF; cursor:help; }

/*Table of contents*/
.refBox { float: right; background: transparent; border: none; margin: 0 0 8px 8px; }
#topicBox { background-color: #eee; border: 1px solid maroon; padding: 0; margin: 0; color: maroon; font-family: Helvetica,Arial,sans-serif; font-size: 12px; }
p.tTitle { margin: 0; padding: 2px 10px; color: white; font-weight: bold; background-color: maroon; }
ul.tItems { margin: 4px 10px !important; list-style-type: none !important; padding: 0 !important; }
ul.tItems li a { color: maroon !important; font-weight: normal !important; border: none !important; }
ul.tItems li a:hover { background-color: #999 !important; color: white !important; }
li.tHi { color: royalblue; }
.keyBox { background #eee; margin: 0 0 4px 0; font-family: Helvetica,Arial,sans-serif; font-size: 9px; font-weight: normal; padding: 0 0 0 12px; }

/*Formatting styles*/
.col4 { -moz-column-count: 4; }
.col3 { -moz-column-count: 3; }
.col2 { -moz-column-count: 2; }
.cols2 { width: 48%; float: left; }
.tableRight { font-size: 12px; font-family: Helvetica,Arial,sans-serif; color: black; float: right; margin-left: 8px; border: 1px solid #666; padding: 6px; }
.tableRight br { margin-bottom: 0 !important; }
.hint { font-size: 11px; position: relative; top: -28px; left: 200px; }
.smbutton a { background-color: #ccc; border: 1px solid #666; color: navy; text-decoration: none; height: 14px; font-size: 12px; padding: 2px; -moz-border-radius: 3px; }
.smbutton a:hover { background-color: #eee; }
.box { border: 1px solid #666; -moz-border-radius: 6px; padding: 8px; }
.hbox { border: 1px solid #818CAF; background: #818CAF; font-family: AvantGarde,Verdana,Helvetica,Arial,sans-serif; font-size: 15px; color: white; font-weight: bold; -moz-border-radius: 6px; padding: 3px 5px; display: block; float: left; margin: 6px 12px 4px 0; text-align: center; }
.break { clear: both; display: block; height: 1px; }
.gray { color: #ccc; }

/*Tables*/
.tableNoBord, .tableNoBord tr, .tableNoBord td { border: none !important; }
.tableTight, .tableTight tr, .tableTight td { margin: 0 !important; padding: 0 2px 1px 0 !important; }
th { background-color: lightslategray !important; }
.datatable { font-family: Verdana,Helvetica,Arial,sans-serif; font-size: 11px; color: black; }
.datatbale td { vertical-align: top; padding: 1px 3px; }
.datatable th { background-color: navy !important; text-align: left; }
.datatable thead td { background-color: lightslategray !important; padding: 1px 3px; font-weight: bold; }
.floatabler {float: right; border: 1px solid #eee; padding: 5px; margin: 5px; max-width: 47%; font-size: 10px;}
.floatablel {float: left; border: 1px solid #eee; padding: 5px; margin: 5px; max-width: 47%; font-size: 10px;}
.floatabler table,td,tr { font-size: 10px; }
.floatablel table,td,tr { font-size: 10px; }

/*SWF controls*/
.swfdiv { margin: 0 0 6px 8px; padding: none; float: right; }
.swfbox { border: 1px solid black; -moz-border-radius: 4px; padding: 4px; margin: 0; }
.swfControls { margin:0; padding:0; height:16px; }
.swfControls input { margin: 0; padding: 0; border: none; height: 16px; width: 16px; }
.swfControls input[name=play] { background: url("icons/playButton.png") no-repeat; }
.swfControls input[name=stop] { background: url("icons/pauseButton.png") no-repeat; }

/*Random image box*/
#rndImgDiv { font-family: Verdana,Helvetica,Arial,sans-serif; font-size: 10px; color: #666; text-align: center; margin-bottom: 2px; }
#rndImgDiv br { margin-bottom: 0 !important; }

/*}}}*/
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/
!!High priority projects for Summer 2011:
*[[PCM Partners]]:
**//dnaK// (most important)
**//groEL//
**proteases
*[[PCM Rescue]]:
**//dnaK// (most important)
**proteases
*[[Aggregation]]:
**Measurement of lag phase for recovery of cells aged with paraquat
**Correlation of aggregates with cell number during recovery
**Measurement of oxidized proteins in aggregates
**Ability of purified PCM to dis-aggregate proteins (DnaK control)
**IbpA-YFP reporter for measuring aggregation
*[[Monitoring Folding]]: vector construction and testing of first proteins
*[[Persisters]]:
**Effect of //pcm// mutations on persister formation
**Survival of strains with increased/decreased persisters +/&ndash; PCM with and without stress
**Growth rate/lag phase of persisters
**Fluorescent reporter?
!!Additional possible projects
*[[Capillary Electrophoresis]]
*[[Competition]]
*Plasmid construction for [[Stasis]]
!!How it works
<<icap "[>img[Vectors for cloning PCR products can incorporate a single-base T overhang<br>to facilitate cloning PCR products.|images/taclone.png]]">>//Taq// DNA polymerase, commonly used in PCR reactions, tends to add an A nucleotide to the 3&prime; ends of PCR products, greatly reducing the efficiency of blunt-end cloning of the DNA fragments. Some cloning schemes exploit this feature of the polymerase by adding 3&prime; single-base T overhangs to each end of a plasmid cut by an enzyme that leaves blunt ends. The T's can anneal with the A's left by //Taq// at the end of the PCR product, facilitating cloning. The T "tails" also prevent the vector from religating. Although //Taq// polymerase usually adds A's to blunt ends, because the polymerase binds dATP most strongly, it can be forced to add T's by only providing dTTP; this feature is used in making the T-tailed vector.
!!Materials
{{proctab{
|Vector DNA|| 5 &mu;g|
|PCR buffer| 10&times;| 10 &mu;l|
|//Taq// polymerase|| 1 u|
|dTTP| 100 mM| 2 &mu;l|
{{proctxt{
!!Procedure###Marchuk1991###
*Digest 5 &mu;g vector with a blunt-cutting restriction enzyme (//Eco//RV, //Sma//I) under optimal conditions in a total volume of 50 &mu;l
*Heat-inactivate the enzyme or purify with Geneclean or Qiagen and elute in 50 &mu;l
*Add 10 &mu;l of 10&times; PCR buffer, 2 &mu;l of 100 mM dTTP, 1 u //Taq// polymerase and 37 &mu;l of nuclease-free dH~~2~~O
*Incubate 2 hours at 72 &deg;C
*Purify vector with Geneclean or Qiagen and elute in 100 &mu;l
*Use 2-5 &mu;l in ligation reactions
}}}
<<list all>>
<<list shadowed>>
''Table 1'': Proteins with high Asp/Asn content and known or hypothesized functions^^a^^
|!gene|!description|!length^^b^^|!Asp+Asn^^c^^|
|//yciU//|dsDNA-mimic protein|109|0.202|
|//ygeG//|predicted chaperon|163|0.172|
|//yibA//|lyase containing HEAT repeat|280|0.171|
|//rfaS//|LPS core biosynthesis protein|311|0.170|
|//hdeA//|acid resistance protein|110|0.155|
|//bfr//|bacterioferritin|158|0.152|
|//sspB//|ClpXP specificity-enhancing factor|165|0.152|
|//wcaM//|colanic acid biosynthesis protein|464|0.151|
|//rfaY//|LPS core biosynthesis protein|232|0.151|
|//imp//|organic solvent tolerance protein|784|0.151|
|//dps//|DNA protection during starvation|167|0.150|
|//ybhC//|predicted pectinesterase|427|0.148|
|//tehB//|predicted methyltransferase|197|0.147|
^^a^^Content of Asp and Asn exceeds mean by &#8805; 2 s.d.; functions as described in GenBank
^^b^^Length of predicted protein in amino acids
^^c^^Fractional Asp+Asn content: total Asp+Asn divided by length
''Table 2'': Proteins with high Asp/Asn content and unknown function^^a^^
|!gene|!length^^b^^|!Asp+Asn^^c^^||!gene|!length|!Asp+Asn|
|//yddK//|318|0.223||//ypjB//|263|0.167|
|//ybgS//|126|0.222||//phnA//|111|0.162|
|//yjgL//|604|0.195||//yhiK//|130|0.162|
|//yjcF//|430|0.193||//ykfB//|155|0.161|
|//yfdF//|352|0.190||//yjgA//|183|0.158|
|//ydcD//|160|0.181||//yhiJ//|540|0.157|
|//yjgD//|138|0.181||//ylbH//|236|0.157|
|//yqeK//|141|0.177||//ygeF//|148|0.155|
|//yjbL//|442|0.176||//yecT//|162|0.154|
|//yrhA//|137|0.175||//yfjU//|104|0.154|
|//ygaQ//|110|0.173||//yhiS//|260|0.154|
|//yhaC//|395|0.172||//yfbO//|158|0.152|
|//yddJ//|111|0.171||//yahL//|271|0.151|
|//yjbM//|235|0.170||//cyaY//|106|0.151|
|//ybaJ//|124|0.169||//yoaB//|114|0.149|
|//yfjJ//|208|0.168||//yfjT//|155|0.148|
|//yhiL//|412|0.167||//yneK//|371|0.148|
|//yccE//|418|0.167|||||
^^a^^Content of Asp and Asn exceeds mean by more than two s.d.; no function or significant similarity described in GenBank
^^b^^Length of predicted protein in amino acids
^^c^^Fractional Asp+Asn content: total Asp+Asn divided by length
''Table 3'': Aggregation-prone proteins with high Asp/Asn content^^a^^
|!gene|!description|!length^^b^^|!Asp+Asn^^c^^|
|//glf//|UDP-galactopyranose mutase|367|0.131|
|//gapA//|glyceraldehyde-3-PO4 dehydrogenase|331|0.130|
|//bipA//|GTP-binding protein|607|0.129|
|//entB//|isochorismatase|285|0.123|
|//rfbB//|dTDP-glucose 4,6 dehydratase|361|0.119|
|//metF//|5,10-methylene THF reductase|296|0.118|
|//arcA//|two-component response regulator|238|0.118|
^^a^^Content of Asp and Asn exceeds mean by more than one standard deviation; described as aggregation-prone (see text)
^^b^^Length of predicted protein in amino acids
^^c^^Fractional Asp+Asn content: total Asp+Asn divided by length
!!Lag
Effect of PCM on recovery^^//a//^^ from stationary phase
|!|>|!lag phase (min)|
|!strain|!pH7|!pH9|
|wild-type, overnight|112 ± 5|301 ± 28|
|&Delta;//pcm//, overnight|120 ± 5|294 ± 24|
|wild-type, aged^^//b//^^|134 ± 8|331 ± 36|
|&Delta;//pcm//, aged|136 ± 8|419 ± 39|
^^//a//^^1:100 dilution in fresh LB broth
^^//b//^^Maintained 5 days in stationary phase in LB broth
/***
|Name|TaggedTemplateTweak|
|Source|http://www.TiddlyTools.com/#TaggedTemplateTweak|
|Documentation|http://www.TiddlyTools.com/#TaggedTemplateTweakInfo|
|Version|1.6.1|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|use alternative ViewTemplate/EditTemplate for specific tiddlers|
This plugin extends the core function, story.chooseTemplateForTiddler(), so that any given tiddler can be viewed and/or edited using alternatives to the standard tiddler templates.
!!!!!Documentation
>see [[TaggedTemplateTweakInfo]]
!!!!!Revisions
<<<
2009.09.02 [1.6.1] apply field-based template (if any) *before* tag-based template
| please see [[TaggedTemplateTweakInfo]] for previous revision details |
2007.06.11 [1.0.0] initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.TaggedTemplateTweak= {major: 1, minor: 6, revision: 1, date: new Date(2009,9,2)};

if (!config.options.txtTemplateTweakFieldname)	
	config.options.txtTemplateTweakFieldname='template';

Story.prototype.taggedTemplate_chooseTemplateForTiddler = Story.prototype.chooseTemplateForTiddler
Story.prototype.chooseTemplateForTiddler = function(title,template)
{
	// get core template and split into theme and template name
	var coreTemplate=this.taggedTemplate_chooseTemplateForTiddler.apply(this,arguments);
	var theme=""; var template=coreTemplate;
	var parts=template.split(config.textPrimitives.sectionSeparator);
	if (parts[1]) { theme=parts[0]; template=parts[1]; }
	else theme=config.options.txtTheme||""; // if theme is not specified
	theme+=config.textPrimitives.sectionSeparator;

	// look for template using title as prefix
	if (!store.getTaggedTiddlers(title).length) { // if tiddler is not a tag
		if (store.getTiddlerText(theme+title+template))
			{ return theme+title+template; } // theme##TitleTemplate
		if (store.getTiddlerText(title+template))
			{ return title+template; }	 // TitleTemplate
	}

	// look for templates using custom field value as prefix
	var v=store.getValue(title,config.options.txtTemplateTweakFieldname);
	if (store.getTiddlerText(theme+v+template))
		{ return theme+v+template; }	// theme##valueTemplate
	if (store.getTiddlerText(v+template))
		{ return v+template; }		// valueTemplate

	// look for template using tags as prefix
	var tiddler=store.getTiddler(title);
	if (!tiddler) return coreTemplate; // tiddler doesn't exist... use core result
	for (i=0; i<tiddler.tags.length; i++) {
		var t=tiddler.tags[i]+template; // add tag prefix to template
		var c=t.substr(0,1).toUpperCase()+t.substr(1); // capitalized for WikiWord title
		if (store.getTiddlerText(theme+t))	{ return theme+t; } // theme##tagTemplate
		if (store.getTiddlerText(theme+c))	{ return theme+c; } // theme##TagTemplate
		if (store.getTiddlerText(t)) 		{ return t; }	    // tagTemplate
		if (store.getTiddlerText(c))		{ return c; }	    // TagTemplate
	}
	
	// no match... use core result
	return coreTemplate;
}
//}}}
[[Aging in //E. coli//]]
[[Aging in E. coli]]
/***
|Name|TiddlerTweakerPlugin|
|Source|http://www.TiddlyTools.com/#TiddlerTweakerPlugin|
|Version|2.4.5|
|Author|Eric Shulman|
|License|http://www.TiddlyTools.com/#LegalStatements|
|~CoreVersion|2.1|
|Type|plugin|
|Description|select multiple tiddlers and modify author, created, modified and/or tag values|
~TiddlerTweaker is a 'power tool' for TiddlyWiki authors.  Select multiple tiddlers from a listbox and 'bulk modify' the creator, author, created, modified and/or tag values of those tiddlers using a compact set of form fields.  The values you enter into the fields simultaneously overwrite the existing values in all tiddlers you have selected.
!!!!!Usage
<<<
{{{<<tiddlerTweaker>>}}}
{{smallform{<<tiddlerTweaker>>}}}
By default, any tags you enter into the TiddlerTweaker will //replace// the existing tags in all the tiddlers you have selected.  However, you can also use TiddlerTweaker to quickly filter specified tags from the selected tiddlers, while leaving any other tags assigned to those tiddlers unchanged:
>Any tag preceded by a '+' (plus) or '-' (minus), will be added or removed from the existing tags //instead of replacing the entire tag definition// of each tiddler (e.g., enter '-excludeLists' to remove that tag from all selected tiddlers.  When using this syntax, care should be taken to ensure that //every// tag is preceded by '+' or '-', to avoid inadvertently overwriting any other existing tags on the selected tiddlers.  (note: the '+' or '-' prefix on each tag value is NOT part of the tag value, and is only used by TiddlerTweaker to control how that tag value is processed)
Important Notes:
* TiddlerTweaker is a 'power user' tool that can make changes to many tiddlers at once.  ''You should always have a recent backup of your document (or 'save changes' just *before* tweaking the tiddlers), just in case you accidentally 'shoot yourself in the foot'.''
* The date and author information on any tiddlers you tweak will ONLY be updated if the corresponding checkboxes have been selected.  As a general rule, after using TiddlerTweaker, always ''//remember to save your document//'' when you are done, even though the tiddler timeline tab may not show any recently modified tiddlers.
* Selecting and updating all tiddlers in a document can take a while.  Your browser may warn about an 'unresponsive script'.  Usually, if you allow it to continue, it should complete the processing... eventually.  Nonetheless, be sure to save your work before you begin tweaking lots of tiddlers, just in case something does get stuck.
<<<
!!!!!Revisions
<<<
2011.01.21 2.4.5 auto-selection: use "-" for untagged tiddlers.  Also, added 'opened', 'invert'
2009.09.15 2.4.4 added 'edit' button. moved html definition to separate section
2009.09.13 2.4.3 in settiddlers(), convert backslashed chars (\n\b\s\t) in replacement text
2009.06.26 2.4.2 only add brackets around tags containing spaces
2009.06.22 2.4.1 in setFields(), add brackets around all tags shown tweaker edit field
2009.03.30 2.4.0 added 'sort by modifier'
2009.01.22 2.3.0 added support for text pattern find/replace
2008.10.27 2.2.3 in setTiddlers(), fixed Safari bug by replacing static Array.concat(...) with new Array().concat(...)
2008.09.07 2.2.2 added removeCookie() function for compatibility with [[CookieManagerPlugin]]
2008.05.12 2.2.1 replace built-in backstage tweak task with tiddler tweaker control panel (moved from BackstageTweaks)
2008.01.13 2.2.0 added 'auto-selection' links: all, changed, tags, title, text
2007.12.26 2.1.0 added support for managing 'creator' custom field (see [[CoreTweaks]])
2007.11.01 2.0.3 added config.options.txtTweakerSortBy for cookie-based persistence of list display order preference setting.
2007.09.28 2.0.2 in settiddlers() and deltiddlers(), added suspend/resume notification handling (improves performance when operating on multiple tiddlers)
2007.08.03 2.0.1 added shadow definition for [[TiddlerTweaker]] tiddler for use as parameter references with {{{<<tiddler>>, <<slider>> or <<tabs>>}}} macros.
2007.08.03 2.0.0 converted from inline script
2006.01.01 1.0.0 initial release
<<<
!!!!!Code
***/
//{{{
version.extensions.TiddlerTweakerPlugin= {major: 2, minor: 4, revision: 5, date: new Date(2011,1,21)};

// shadow tiddler
config.shadowTiddlers.TiddlerTweaker='<<tiddlerTweaker>>';

// defaults
if (config.options.txtTweakerSortBy==undefined) config.options.txtTweakerSortBy='modified';

// backstage task
if (config.tasks) { // for TW2.2b3 or above
	config.tasks.tweak.tooltip='review/modify tiddler internals: dates, authors, tags, etc.';
	config.tasks.tweak.content='{{smallform small groupbox{<<tiddlerTweaker>>}}}';
}

// if removeCookie() function is not defined by TW core, define it here.
if (window.removeCookie===undefined) {
	window.removeCookie=function(name) {
		document.cookie = name+'=; expires=Thu, 01-Jan-1970 00:00:01 UTC; path=/;'; 
	}
}

config.macros.tiddlerTweaker = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var span=createTiddlyElement(place,'span');
		span.innerHTML=store.getTiddlerText('TiddlerTweakerPlugin##html');
		this.init(span.getElementsByTagName('form')[0],config.options.txtTweakerSortBy);
	},
	init: function(f,sortby) { // set form controls
		if (!f) return; // form might not be rendered yet...
		while (f.list.options[0]) f.list.options[0]=null; // empty the list
		var tids=store.getTiddlers(sortby);
		if (sortby=='size') // descending order
			tids.sort(function(a,b) {return a.text.length > b.text.length ? -1 : (a.text.length == b.text.length ? 0 : +1);});
		var who='';
		for (i=0; i<tids.length; i++) { var t=tids[i];
			var label=t.title; var value=t.title;
			switch (sortby) {
				case 'modified':
				case 'created':
					var t=tids[tids.length-i-1]; // reverse order
					var when=t[sortby].formatString('YY.0MM.0DD 0hh:0mm ');
					label=when+t.title;
					value=t.title;
					break;
				case 'size':
					label='['+t.text.length+'] '+label;
					break;
				case 'modifier':
				case 'creator':
					if (who!=t[sortby]) {
						who=t[sortby];
						f.list.options[f.list.length]=new Option('by '+who+':','',false,false);
					}
					label='\xa0\xa0\xa0'+label; // indent
					break;
			}
			f.list.options[f.list.length]=new Option(label,value,false,false);
		}
		f.title.value=f.who.value=f.creator.value=f.tags.value='';
		f.cm.value=f.cd.value=f.cy.value=f.ch.value=f.cn.value='';
		f.mm.value=f.md.value=f.my.value=f.mh.value=f.mn.value='';
		f.stats.disabled=f.set.disabled=f.del.disabled=f.edit.disabled=f.display.disabled=true;
		f.settitle.disabled=false;
		config.options.txtTweakerSortBy=sortby;
		f.sortby.value=sortby; // sync droplist
		if (sortby!='modified') saveOptionCookie('txtTweakerSortBy');
		else removeCookie('txtTweakerSortBy');
	},
	enablefields: function(here) { // enables/disables inputs based on #items selected
		var f=here.form; var list=f.list;
		var c=0; for (i=0;i<list.length;i++) if (list.options[i].selected) c++;
		if (c>1) f.title.disabled=true;
		if (c>1) f.settitle.checked=false;
		f.set.disabled=(c==0);
		f.del.disabled=(c==0);
		f.edit.disabled=(c==0);
		f.display.disabled=(c==0);
		f.settitle.disabled=(c>1);
		f.stats.disabled=(c==0);
		var msg=(c==0)?'select tiddlers':(c+' tiddler'+(c!=1?'s':'')+' selected');
		here.previousSibling.firstChild.firstChild.nextSibling.innerHTML=msg;
		if (c) clearMessage(); else displayMessage('no tiddlers selected');
	},
	setfields: function(here) { // set fields from first selected tiddler
		var f=here.form;
		if (!here.value.length) {
			f.title.value=f.who.value=f.creator.value=f.tags.value='';
			f.cm.value=f.cd.value=f.cy.value=f.ch.value=f.cn.value='';
			f.mm.value=f.md.value=f.my.value=f.mh.value=f.mn.value='';
			return;
		}
		var tid=store.getTiddler(here.value); if (!tid) return;
		f.title.value=tid.title;
		f.who.value=tid.modifier;
		f.creator.value=tid.fields['creator']||''; // custom field - might not exist
		f.tags.value=tid.tags.map(function(t){return String.encodeTiddlyLink(t)}).join(' ');
		var c=tid.created; var m=tid.modified;
		f.cm.value=c.getMonth()+1;
		f.cd.value=c.getDate();
		f.cy.value=c.getFullYear();
		f.ch.value=c.getHours();
		f.cn.value=c.getMinutes();
		f.mm.value=m.getMonth()+1;
		f.md.value=m.getDate();
		f.my.value=m.getFullYear();
		f.mh.value=m.getHours();
		f.mn.value=m.getMinutes();
	},
	selecttiddlers: function(here,callback) {
		var f=here; while (f&&f.nodeName.toLowerCase()!='form')f=f.parentNode;
		for (var t=f.list.options.length-1; t>=0; t--)
			f.list.options[t].selected=callback(f.list.options[t]);
		config.macros.tiddlerTweaker.enablefields(f.list);
		return false;
	},
	settiddlers: function(here) {
		var f=here.form; var list=f.list;
		var tids=[];
		for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
		if (!tids.length) { alert('please select at least one tiddler'); return; }
		var cdate=new Date(f.cy.value,f.cm.value-1,f.cd.value,f.ch.value,f.cn.value);
		var mdate=new Date(f.my.value,f.mm.value-1,f.md.value,f.mh.value,f.mn.value);
		if (tids.length>1 && !confirm('Are you sure you want to update these tiddlers:\n\n'+tids.join(', '))) return;
		store.suspendNotifications();
		for (t=0;t<tids.length;t++) {
			var tid=store.getTiddler(tids[t]); if (!tid) continue;
			var title=!f.settitle.checked?tid.title:f.title.value;
			var who=!f.setwho.checked?tid.modifier:f.who.value;
			var text=tid.text;
			if (f.replacetext.checked) {
				var r=f.replacement.value.replace(/\\t/mg,'\t').unescapeLineBreaks();
				text=text.replace(new RegExp(f.pattern.value,'mg'),r);
			}				
			var tags=tid.tags;
			if (f.settags.checked) { 
				var intags=f.tags.value.readBracketedList();
				var addtags=[]; var deltags=[]; var reptags=[];
				for (i=0;i<intags.length;i++) {
					if (intags[i].substr(0,1)=='+')
						addtags.push(intags[i].substr(1));
					else if (intags[i].substr(0,1)=='-')
						deltags.push(intags[i].substr(1));
					else
						reptags.push(intags[i]);
				}
				if (reptags.length)
					tags=reptags;
				if (addtags.length)
					tags=new Array().concat(tags,addtags);
				if (deltags.length)
					for (i=0;i<deltags.length;i++)
						{ var pos=tags.indexOf(deltags[i]); if (pos!=-1) tags.splice(pos,1); }
			}
			if (!f.setcdate.checked) cdate=tid.created;
			if (!f.setmdate.checked) mdate=tid.modified;
			store.saveTiddler(tid.title,title,text,who,mdate,tags,tid.fields);
			if (f.setcreator.checked) store.setValue(tid.title,'creator',f.creator.value); // set creator
			if (f.setcdate.checked) tid.assign(null,null,null,null,null,cdate); // set create date
		}
		store.resumeNotifications();
		this.init(f,f.sortby.value);
	},
	displaytiddlers: function(here,edit) {
		var f=here.form; var list=f.list;
		var tids=[];
		for (i=0; i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
		if (!tids.length) { alert('please select at least one tiddler'); return; }
		story.displayTiddlers(story.findContainingTiddler(f),tids,edit?DEFAULT_EDIT_TEMPLATE:null);
	},
	deltiddlers: function(here) {
		var f=here.form; var list=f.list;
		var tids=[];
		for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
		if (!tids.length) { alert('please select at least one tiddler'); return; }
		if (!confirm('Are you sure you want to delete these tiddlers:\n\n'+tids.join(', '))) return;
		store.suspendNotifications();
		for (t=0;t<tids.length;t++) {
			var tid=store.getTiddler(tids[t]); if (!tid) continue;
			if (tid.tags.contains('systemConfig')) {
				var msg=tid.title+' is tagged with systemConfig.'
					+'\n\nRemoving this tiddler may cause unexpected results.  Are you sure?';
				if (!confirm(msg)) continue;
			}
			store.removeTiddler(tid.title);
			story.closeTiddler(tid.title);
		}
		store.resumeNotifications();
		this.init(f,f.sortby.value);
	},
	stats: function(here) {
		var f=here.form; var list=f.list; var tids=[]; var out=''; var tot=0;
		var target=f.nextSibling;
		for (i=0;i<list.length;i++) if (list.options[i].selected) tids.push(list.options[i].value);
		if (!tids.length) { alert('please select at least one tiddler'); return; }
		for (t=0;t<tids.length;t++) {
			var tid=store.getTiddler(tids[t]); if (!tid) continue;
			out+='[['+tid.title+']] '+tid.text.length+'\n'; tot+=tid.text.length;
		}
		var avg=tot/tids.length;
		out=tot+' bytes in '+tids.length+' selected tiddlers ('+avg+' bytes/tiddler)\n<<<\n'+out+'<<<\n';
		removeChildren(target);
		target.innerHTML="<hr><font size=-2><a href='javascript:;' style='float:right' "
			+"onclick='this.parentNode.parentNode.style.display=\"none\"'>close</a></font>";
		wikify(out,target);
		target.style.display='block';
	}
};
//}}}
/***
//{{{
!html
<style>
.tiddlerTweaker table,
.tiddlerTweaker table tr,
.tiddlerTweaker table td
	{ padding:0;margin:0;border:0;white-space:nowrap; }
</style><form class='tiddlerTweaker'><!--
--><table style="width:100%"><tr valign="top"><!--
--><td style="text-align:center;width:99%;"><!--
	--><font size=-2><div style="text-align:left;"><span style="float:right"><!--
	-->&nbsp; <a href="javascript:;" 
		title="select all tiddlers"
		onclick="return config.macros.tiddlerTweaker.selecttiddlers(this,function(opt){
			return opt.value.length;
		});">all</a><!--
	-->&nbsp; <a href="javascript:;" 
		title="select tiddlers currently displayed in the story column"
		onclick="return config.macros.tiddlerTweaker.selecttiddlers(this,function(opt){
			return story.getTiddler(opt.value);
		});">opened</a><!--
	-->&nbsp; <a href="javascript:;" 
		title="select tiddlers that are new/changed since the last file save"
		onclick="var lastmod=new Date(document.lastModified);
			return config.macros.tiddlerTweaker.selecttiddlers(this,function(opt){
				var tid=store.getTiddler(opt.value);
				return tid&&tid.modified>lastmod;
			});
		">changed</a><!--
	-->&nbsp; <a href="javascript:;" 
		title="select tiddlers with at least one matching tag"
		onclick="var t=prompt('Enter space-separated tags (match one or more).  Use \x22-\x22 to match untagged tiddlers');
			if (!t||!t.length) return false;
			var tags=t.readBracketedList();
			return config.macros.tiddlerTweaker.selecttiddlers(this,function(opt){
				var tid=store.getTiddler(opt.value);
				return tid&&tags[0]=='-'?!tid.tags.length:tid.tags.containsAny(tags);
			});
		">tags</a><!--
	-->&nbsp; <a href="javascript:;" 
		title="select tiddlers whose titles include matching text"
		onclick="var t=prompt('Enter a title (or portion of a title) to match');
			if (!t||!t.length) return false;
			return config.macros.tiddlerTweaker.selecttiddlers(this,function(opt){
				return opt.value.indexOf(t)!=-1;
			});
		">titles</a><!--
	-->&nbsp; <a href="javascript:;" 
		title="select tiddlers containing matching text"
		onclick="var t=prompt('Enter tiddler text (content) to match');
			if (!t||!t.length) return false;
			return config.macros.tiddlerTweaker.selecttiddlers(this,function(opt){
				var tt=store.getTiddlerText(opt.value,'');
				return tt.indexOf(t)!=-1;
			});
		">text</a><!--
	-->&nbsp; <a href="javascript:;" 
		title="reverse selection of all list items"
		onclick="return config.macros.tiddlerTweaker.selecttiddlers(this,function(opt){
			return !opt.selected;
		});">invert</a><!--
	--></span><span>select tiddlers</span><!--
	--></div><!--
	--></font><select multiple name=list size="11" style="width:99.99%" 
		title="use click, shift-click and/or ctrl-click to select multiple tiddler titles" 
		onclick="config.macros.tiddlerTweaker.enablefields(this)" 
		onchange="config.macros.tiddlerTweaker.setfields(this)"><!--
	--></select><br><!--
	-->show<input type=text size=1 value="11" 
		onchange="this.form.list.size=this.value; this.form.list.multiple=(this.value>1);"><!--
	-->by<!--
	--><select name=sortby size=1 
		onchange="config.macros.tiddlerTweaker.init(this.form,this.value)"><!--
	--><option value="title">title</option><!--
	--><option value="size">size</option><!--
	--><option value="modified">modified</option><!--
	--><option value="created">created</option><!--
	--><option value="modifier">modifier</option><!--
	--></select><!--
	--><input type="button" value="refresh" 
		onclick="config.macros.tiddlerTweaker.init(this.form,this.form.sortby.value)"<!--
	--> <input type="button" name="stats" disabled value="totals..." 
		onclick="config.macros.tiddlerTweaker.stats(this)"><!--
--></td><td style="width:1%"><!--
	--><div style="text-align:left"><font size=-2>&nbsp;modify values</font></div><!--
	--><table style="width:100%;"><tr><!--
	--><td style="padding:1px"><!--
		--><input type=checkbox name=settitle unchecked 
			title="allow changes to tiddler title (rename tiddler)" 
			onclick="this.form.title.disabled=!this.checked">title<!--
	--></td><td style="padding:1px"><!--
		--><input type=text name=title size=35 style="width:98%" disabled><!--
	--></td></tr><tr><td style="padding:1px"><!--
		--><input type=checkbox name=setcreator unchecked 
			title="allow changes to tiddler creator" 
			onclick="this.form.creator.disabled=!this.checked">created by<!--
	--></td><td style="padding:1px;"><!--
		--><input type=text name=creator size=35 style="width:98%" disabled><!--
	--></td></tr><tr><td style="padding:1px"><!--
		--><input type=checkbox name=setwho unchecked 
			title="allow changes to tiddler author" 
			onclick="this.form.who.disabled=!this.checked">modified by<!--
	--></td><td style="padding:1px"><!--
		--><input type=text name=who size=35 style="width:98%" disabled><!--
	--></td></tr><tr><td style="padding:1px"><!--
		--><input type=checkbox name=setcdate unchecked 
			title="allow changes to created date" 
			onclick="var f=this.form;
				f.cm.disabled=f.cd.disabled=f.cy.disabled=f.ch.disabled=f.cn.disabled=!this.checked"><!--
		-->created on<!--
	--></td><td style="padding:1px"><!--
		--><input type=text name=cm size=2 style="width:2em;padding:0;text-align:center" disabled><!--
		--> / <input type=text name=cd size=2 style="width:2em;padding:0;text-align:center" disabled><!--
		--> / <input type=text name=cy size=4 style="width:3em;padding:0;text-align:center" disabled><!--
		--> at <input type=text name=ch size=2 style="width:2em;padding:0;text-align:center" disabled><!--
		--> : <input type=text name=cn size=2 style="width:2em;padding:0;text-align:center" disabled><!--
	--></td></tr><tr><td style="padding:1px"><!--
		--><input type=checkbox name=setmdate unchecked 
			title="allow changes to modified date" 
			onclick="var f=this.form;
				f.mm.disabled=f.md.disabled=f.my.disabled=f.mh.disabled=f.mn.disabled=!this.checked"><!--
		-->modified on<!--
	--></td><td style="padding:1px"><!--
		--><input type=text name=mm size=2 style="width:2em;padding:0;text-align:center" disabled><!--
		--> / <input type=text name=md size=2 style="width:2em;padding:0;text-align:center" disabled><!--
		--> / <input type=text name=my size=4 style="width:3em;padding:0;text-align:center" disabled><!--
		--> at <input type=text name=mh size=2 style="width:2em;padding:0;text-align:center" disabled><!--
		--> : <input type=text name=mn size=2 style="width:2em;padding:0;text-align:center" disabled><!--
	--></td></tr><tr><td style="padding:1px"><!--
		--><input type=checkbox name=replacetext unchecked
			title="find/replace matching text" 
			onclick="this.form.pattern.disabled=this.form.replacement.disabled=!this.checked">replace text<!--
	--></td><td style="padding:1px"><!--
		--><input type=text name=pattern size=15 value="" style="width:40%" disabled 
			title="enter TEXT PATTERN (regular expression)"> with<!--
		--><input type=text name=replacement size=15 value="" style="width:40%" disabled 
			title="enter REPLACEMENT TEXT"><!--
	--></td></tr><tr><td style="padding:1px"><!--
		--><input type=checkbox name=settags checked 
			title="allow changes to tiddler tags" 
			onclick="this.form.tags.disabled=!this.checked">tags<!--
	--></td><td style="padding:1px"><!--
		--><input type=text name=tags size=35 value="" style="width:98%" 
			title="enter new tags or use '+tag' and '-tag' to add/remove tags from existing tags"><!--
	--></td></tr></table><!--
	--><div style="text-align:center"><!--
	--><nobr><input type=button name=display disabled style="width:24%" value="display" 
		title="show selected tiddlers"
		onclick="config.macros.tiddlerTweaker.displaytiddlers(this,false)"><!--
	--> <input type=button name=edit disabled style="width:23%" value="edit" 
		title="edit selected tiddlers"
		onclick="config.macros.tiddlerTweaker.displaytiddlers(this,true)"><!--
	--> <input type=button name=del disabled style="width:24%" value="delete" 
		title="remove selected tiddlers"
		onclick="config.macros.tiddlerTweaker.deltiddlers(this)"><!--
	--> <input type=button name=set disabled style="width:24%" value="update" 
		title="update selected tiddlers"
		onclick="config.macros.tiddlerTweaker.settiddlers(this)"></nobr><!--
	--></div><!--
--></td></tr></table><!--
--></form><span style="display:none"><!--content replaced by tiddler "stats"--></span>
!end
//}}}
***/
 
/***
|''Name:''|TiddlersBarPlugin|
|''Description:''|A bar to switch between tiddlers through tabs (like browser tabs bar).|
|''Version:''|1.2.5|
|''Date:''|Jan 18,2008|
|''Source:''|http://visualtw.ouvaton.org/VisualTW.html|
|''Author:''|Pascal Collin|
|''License:''|[[BSD open source license|License]]|
|''~CoreVersion:''|2.1.0|
|''Browser:''|Firefox 2.0; InternetExplorer 6.0, others|
!Demos
On [[homepage|http://visualtw.ouvaton.org/VisualTW.html]], open several tiddlers to use the tabs bar.
!Installation
#import this tiddler from [[homepage|http://visualtw.ouvaton.org/VisualTW.html]] (tagged as systemConfig)
#save and reload
#''if you're using a custom [[PageTemplate]]'', add {{{<div id='tiddlersBar' refresh='none' ondblclick='config.macros.tiddlersBar.onTiddlersBarAction(event)'></div>}}} before {{{<div id='tiddlerDisplay'></div>}}}
#optionally, adjust StyleSheetTiddlersBar
!Tips
*Doubleclick on the tiddlers bar (where there is no tab) create a new tiddler.
*Tabs include a button to close {{{x}}} or save {{{!}}} their tiddler.
*By default, click on the current tab close all others tiddlers.
!Configuration options 
<<option chkDisableTabsBar>> Disable the tabs bar (to print, by example).
<<option chkHideTabsBarWhenSingleTab >> Automatically hide the tabs bar when only one tiddler is displayed. 
<<option txtSelectedTiddlerTabButton>> ''selected'' tab command button.
<<option txtPreviousTabKey>> previous tab access key.
<<option txtNextTabKey>> next tab access key.
!Code
***/
//{{{
config.options.chkDisableTabsBar = config.options.chkDisableTabsBar ? config.options.chkDisableTabsBar : false;
config.options.chkHideTabsBarWhenSingleTab  = config.options.chkHideTabsBarWhenSingleTab  ? config.options.chkHideTabsBarWhenSingleTab  : false;
config.options.txtSelectedTiddlerTabButton = config.options.txtSelectedTiddlerTabButton ? config.options.txtSelectedTiddlerTabButton : "closeOthers";
config.options.txtPreviousTabKey = config.options.txtPreviousTabKey ? config.options.txtPreviousTabKey : "";
config.options.txtNextTabKey = config.options.txtNextTabKey ? config.options.txtNextTabKey : "";
config.macros.tiddlersBar = {
	tooltip : "see ",
	tooltipClose : "click here to close this tab",
	tooltipSave : "click here to save this tab",
	promptRename : "Enter tiddler new name",
	currentTiddler : "",
	previousState : false,
	previousKey : config.options.txtPreviousTabKey,
	nextKey : config.options.txtNextTabKey,	
	tabsAnimationSource : null, //use document.getElementById("tiddlerDisplay") if you need animation on tab switching.
	handler: function(place,macroName,params) {
		var previous = null;
		if (config.macros.tiddlersBar.isShown()) {
			story.forEachTiddler(function(title,e){
				if (title==config.macros.tiddlersBar.currentTiddler){
					var d = createTiddlyElement(null,"span",null,"tab tabSelected");
					config.macros.tiddlersBar.createActiveTabButton(d,title);
					if (previous && config.macros.tiddlersBar.previousKey) previous.setAttribute("accessKey",config.macros.tiddlersBar.nextKey);
					previous = "active";
				}
				else {
					var d = createTiddlyElement(place,"span",null,"tab tabUnselected");
					var btn = createTiddlyButton(d,title,config.macros.tiddlersBar.tooltip + title,config.macros.tiddlersBar.onSelectTab);
					btn.setAttribute("tiddler", title);
					if (previous=="active" && config.macros.tiddlersBar.nextKey) btn.setAttribute("accessKey",config.macros.tiddlersBar.previousKey);
					previous=btn;
				}
				var isDirty =story.isDirty(title);
				var c = createTiddlyButton(d,isDirty ?"!":"x",isDirty?config.macros.tiddlersBar.tooltipSave:config.macros.tiddlersBar.tooltipClose, isDirty ? config.macros.tiddlersBar.onTabSave : config.macros.tiddlersBar.onTabClose,"tabButton");
				c.setAttribute("tiddler", title);
				if (place.childNodes) {
					place.insertBefore(document.createTextNode(" "),place.firstChild); // to allow break line here when many tiddlers are open
					place.insertBefore(d,place.firstChild); 
				}
				else place.appendChild(d);
			})
                  var th = jQuery("#tiddlersBar").attr("offsetHeight");
                  if ( th == 0 ) { jQuery("#tiddlersBar").show(); }
                  }
                else { jQuery("#tiddlersBar").hide(); }
          
	}, 
	refresh: function(place,params){
		removeChildren(place);
		config.macros.tiddlersBar.handler(place,"tiddlersBar",params);
		if (config.macros.tiddlersBar.previousState!=config.macros.tiddlersBar.isShown()) {
			story.refreshAllTiddlers();
			if (config.macros.tiddlersBar.previousState) story.forEachTiddler(function(t,e){e.style.display="";});
			config.macros.tiddlersBar.previousState = !config.macros.tiddlersBar.previousState;
		}
	},
	isShown : function(){
		if (config.options.chkDisableTabsBar) return false;
		if (!config.options.chkHideTabsBarWhenSingleTab) return true;
		var cpt=0;
		story.forEachTiddler(function(){cpt++});
		return (cpt>1);
	},
	selectNextTab : function(){  //used when the current tab is closed (to select another tab)
		var previous="";
		story.forEachTiddler(function(title){
			if (!config.macros.tiddlersBar.currentTiddler) {
				story.displayTiddler(null,title);
				return;
			}
			if (title==config.macros.tiddlersBar.currentTiddler) {
				if (previous) {
					story.displayTiddler(null,previous);
					return;
				}
				else config.macros.tiddlersBar.currentTiddler=""; 	// so next tab will be selected
			}
			else previous=title;
			});		
	},
	onSelectTab : function(e){
		var t = this.getAttribute("tiddler");
		if (t) story.displayTiddler(null,t);
		return false;
	},
	onTabClose : function(e){
		var t = this.getAttribute("tiddler");
		if (t) {
			if(story.hasChanges(t) && !readOnly) {
				if(!confirm(config.commands.cancelTiddler.warning.format([t])))
				return false;
			}
			story.closeTiddler(t);
		}
		return false;
	},
	onTabSave : function(e) {
		var t = this.getAttribute("tiddler");
		if (!e) e=window.event;
		if (t) config.commands.saveTiddler.handler(e,null,t);
		return false;
	},
	onSelectedTabButtonClick : function(event,src,title) {
		var t = this.getAttribute("tiddler");
		if (!event) event=window.event;
		if (t && config.options.txtSelectedTiddlerTabButton && config.commands[config.options.txtSelectedTiddlerTabButton])
			config.commands[config.options.txtSelectedTiddlerTabButton].handler(event, src, t);
		return false;
	},
	onTiddlersBarAction: function(event) {
		var source = event.target ? event.target.id : event.srcElement.id; // FF uses target and IE uses srcElement;
		if (source=="tiddlersBar") story.displayTiddler(null,'New Tiddler',DEFAULT_EDIT_TEMPLATE,false,null,null);
	},
	createActiveTabButton : function(place,title) {
		if (config.options.txtSelectedTiddlerTabButton && config.commands[config.options.txtSelectedTiddlerTabButton]) {
			var btn = createTiddlyButton(place, title, config.commands[config.options.txtSelectedTiddlerTabButton].tooltip ,config.macros.tiddlersBar.onSelectedTabButtonClick);
			btn.setAttribute("tiddler", title);
		}
		else
			createTiddlyText(place,title);
	}
}

story.coreCloseTiddler = story.coreCloseTiddler? story.coreCloseTiddler : story.closeTiddler;
story.coreDisplayTiddler = story.coreDisplayTiddler ? story.coreDisplayTiddler : story.displayTiddler;

story.closeTiddler = function(title,animate,unused) {
	if (title==config.macros.tiddlersBar.currentTiddler)
		config.macros.tiddlersBar.selectNextTab();
	story.coreCloseTiddler(title,false,unused); //disable animation to get it closed before calling tiddlersBar.refresh
	var e=document.getElementById("tiddlersBar");
	if (e) config.macros.tiddlersBar.refresh(e,null);
}

story.displayTiddler = function(srcElement,tiddler,template,animate,unused,customFields,toggle){
	story.coreDisplayTiddler(config.macros.tiddlersBar.tabsAnimationSource,tiddler,template,animate,unused,customFields,toggle);
	var title = (tiddler instanceof Tiddler)? tiddler.title : tiddler;  
	if (config.macros.tiddlersBar.isShown()) {
		story.forEachTiddler(function(t,e){
			if (t!=title) e.style.display="none";
			else e.style.display="";
		})
		config.macros.tiddlersBar.currentTiddler=title;
	}
	var e=document.getElementById("tiddlersBar");
	if (e) config.macros.tiddlersBar.refresh(e,null);
}

var coreRefreshPageTemplate = coreRefreshPageTemplate ? coreRefreshPageTemplate : refreshPageTemplate;
refreshPageTemplate = function(title) {
	coreRefreshPageTemplate(title);
	if (config.macros.tiddlersBar) config.macros.tiddlersBar.refresh(document.getElementById("tiddlersBar"));
}

ensureVisible=function (e) {return 0} //disable bottom scrolling (not useful now)

config.refreshers.none = function(){return true;}

//}}}
To place icons in the title bar of a tiddler based on text (case-insensitive) in its tags, list below using the syntax:
{{{|tag|path/to icon.png|}}}. Replace spaces with underlines.
----
|research_overview|icons/bgIcon.png|
|scientific_background|icons/nbookIcon.png|
|projects|icons/projIcon.png|
|project_outline|icons/beakerIcon.png|
|current_hypotheses|icons/bigQuestion.png|
|labtools|icons/labtoolsIcon.png|
|lab_members|icons/labratIcon.png|

Functionality
*Login - remove backstage if not logged in
*Login - need an Admin version of MainMenu and a distinct password
*Clean up and improve Main Menu; have a separate Public Menu shown if not logged in (maybe hidden sections of one menu??)
*Publications and Presentations
*Protocols/Recipes/Toos tabs up by menu tab...where we could have a full list like the Firefox sidebar?
*Develop a "lightbox" function (or at least a way to open an image in a new tab); add data thumbnails to the Lab Members and Alumni pages that can be clicked to show full-size
*Improve Search (e.g., edit toolbar as in...Primers?)
*Input/Edit form for protocols and recipes
*Add Projects menu
*Add image sizer and shift-click/ctrl-click to customized image handler (use ImageSizePlugin)
Bugs
*Click on reference shouldn't say "undefined" if reference isn't in list...
*Is the ref scan including a PubMed link if there's no PDF for the reference? Should it go to Pubget rather than to the journal if there is a PDF?
*truncate function doesn't seem to be truncating to a word
Improvements
*Add a reference page for each project that will pull references from the references DB tagged project:name
*Add "short title" field to protocol input and use this in the menu instead of truncation
*Add customized new tiddler link to protocols and recipes menus --> appropriate add form
*Set styles/heights for tiddler being edited so that textarea scrolls and toolbar and top bars stay in sight.



{{col3{
<<forEachTiddler
  where 'tiddler.tags.contains("LabTools")'
  write '"[["+ tiddler.title +"]]\n"'
  >>
}}}
|~ViewToolbar|+editTiddler closeTiddler|
|~EditToolbar|+saveTiddler -cancelTiddler copyTiddler deleteTiddler|
|~ViewRefToolbar|closeRef showPDF showNote +editRef|
|~ViewRefToolbar2|closeRef showPDF showNote +editRef orderMe|
|~EditNoteToolbar|+saveTiddler -cancelTiddler copyTiddler deleteTiddler|
|~ViewListToolbar|newRefTiddler refreshMe searchRefs +editTiddler closeTiddler|
|~TopicToolbar|reloadTopics +editTiddler closeTiddler|
|~TopicViewToolbar|+editTiddler closeTiddler|
|~PublicToolbar|closeTiddler|
//{{{
//replaces toolbar buttons with icons.
//for each command that you want to use an icon, add a line like the following in a systemConfig tiddler, specifying the icon image location:
//config.commands.editTiddler.imgLoc= "jump.bmp";
//No need to edit the ViewTemplate! If an image location is specified, then the icon will be used for that command!

config.macros.toolbar.createCommand = function(place,commandName,tiddler,theClass)
{
	if(typeof commandName != "string")
		{
		var c = null;
		for(var t in config.commands)
			if(config.commands[t] == commandName)
				c = t;
		commandName = c;
		}
	if((tiddler instanceof Tiddler) && (typeof commandName == "string"))
		{
		var title = tiddler.title;
		var command = config.commands[commandName];
		var ro = tiddler.isReadOnly();
		var shadow = store.isShadowTiddler(title) && !store.tiddlerExists(title);
		var text = ro && command.readOnlyText ? command.readOnlyText : command.text;
		var tooltip = ro && command.readOnlyTooltip ? command.readOnlyTooltip : command.tooltip;
		if((!ro || (ro && !command.hideReadOnly)) && !(shadow && command.hideShadow))
		    {
			    var btn = createTiddlyButton(null,text,tooltip,this.onClickCommand);
			    btn.setAttribute("commandName", commandName);
			    btn.setAttribute("tiddler", title);
			    if(theClass)
				            addClass(btn,theClass);
                             place.appendChild(btn);
                            if(command.imgLoc)
                                   btn.innerHTML = "<img src='"+command.imgLoc+"'>";

		     }
       }
}
//}}}
// // Show/attach PDF
//{{{
config.commands.showPDF = {
	text: 'showPDF',
	hideReadOnly: false,
	tooltip: 'Show or download PDF for this article',
	handler: function(event,src,title)
		{ return config.commands.showPDF.click(src,event); },
	click: function(here,ev) {
                var tiddlerElem=story.findContainingTiddler(here);
                var title=tiddlerElem.getAttribute('tiddler')
                var ptitle = title + ".pdf"
                if ( store.tiddlerExists(ptitle) ) {
                  var atest = config.macros.attach.isAttachment(ptitle);
                  if ( atest) {
                   var alink = config.macros.attach.getAttachment(ptitle);
                   window.open(alink);
                   }
                 else { story.displayTiddler(null,ptitle); }
                  }
                else {
                  var fplace = jQuery(".aform").get(0);
                  if ( fplace.innerHTML == "" ) { wikify("<<attach " + title + ">>",fplace); }
                  jQuery(".aform").show();
                  }
                }
  };
//}}}

// //Show or create note page
//{{{
config.commands.showNote = {
	text: 'showNote',
	hideReadOnly: false,
	tooltip: 'Show or create the notes page for this article',
	handler: function(event,src,title)
		{ return config.commands.showNote.click(src,event); },
	click: function(here,ev) {
		var tiddlerElem=story.findContainingTiddler(here);
		var title=tiddlerElem.getAttribute('tiddler');
                var ntitle = store.getValue(title,"ntid");
                if ( !store.tiddlerExists(ntitle) ) {
                  store.saveTiddler(ntitle,ntitle,"",config.options.txtUserName,new Date(),"notes");
                  story.displayTiddler(null,ntitle);
                  config.commands.editTiddler.handler(null, null, ntitle);
                  }
                else { story.displayTiddler(null,ntitle); }
                }
  };
//}}}

// // Edit reference
//{{{
config.commands.editRef = {
  text: 'editRef',
  hideReadOnly: true,
  tooltip: 'Edit this reference',
  handler: function(event,src,title) { config.commands.editTiddler.handler(event, src, title); }
  };
//}}}

// // Close reference
//{{{
config.commands.closeRef = {
  text: 'closeRef',
  hideReadOnly: false,
  tooltip: 'Close this reference',
  handler: function(event,src,title) { 
    config.commands.closeTiddler.handler(event, src, title);
    story.refreshTiddler("References",null,true);
    }
  };
//}}}

// // Refresh topics
//{{{
config.commands.reloadTopics = {
  text: 'reloadTopics',
  hideReadOnly: false,
  tooltip: 'Reload topic list',
  handler: function(event,src,title) { config.macros.topicScan.scanStart(); }
  };
//}}}

// // Refresh current tiddler
//{{{
config.commands.refreshMe = {
  text: 'refresh',
  hideReadOnly: false,
  tooltip: 'refresh current tiddler',
  handler: function(event,src,title) {
    story.refreshTiddler(title,null,true);
    }
  };
//}}}

// // New reference
//{{{
config.commands.newRefTiddler = {
  text: 'new',
  hideReadOnly: true,
  tooltip: 'Add a new reference',
  handler: function() { config.macros.newRefStart(); }
  };
//}}}

// // Search
//{{{
config.commands.searchRefs = {
  text: 'search',
  hideReadOnly: false,
  tooltip: 'search references',
  handler: function(e) {
    if (!e) var e = window.event;
    var parent=story.findContainingTiddler(resolveTarget(e).parentNode);
    var panel = createTiddlyElement(parent,"span","searchPanel","searchPanel",null);
    var html = store.getTiddler("SearchForm").text;
    panel.innerHTML=html;
    jQuery("#searchPanel input[value='Cancel']").click(function() { jQuery("#searchPanel").remove(); });
    jQuery("#searchPanel input[value='Search']").click(function() { jQuery("#searchPanel").remove(); goSearch(this.form) });
    jQuery("#searchPanel input").bind("keydown", function(event) { 
      var keycode = (event.keyCode ? event.keyCode : (event.which ? event.which : event.charCode));
      if (keycode == 13) { document.getElementById('searchButton').click(); return false; } else  { return true; }
      });
    jQuery("#searchPanel").show();
    jQuery("#searchText").focus();
    e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();
    }
  };

function goSearch(form) {
  // if it's a simple search, the top search text field has content
  if ( form.searchText.value != "" ) {
    // determine if searching for all words, any words or phrase
    for ( var i=0;i<form.sType.length;i++ ) {
      if ( form.sType[i].checked ) { var howSearch = form.sType[i].value; break; }
      }
    // get needle and haystacks
    var needle = form.searchText.value;
    var haystacks = [];
    for ( var i=0; i<form.inWhich.length; i++ ) {
      if ( form.inWhich[i].checked ) {
        var getText = "";
        var searchField = form.inWhich[i].value;
        if ( searchField == "notes" ) { getText = "if(store.tiddlerExists(tids[i].title+\" Notes\")){store.getTiddler(tids[i].title + \" Notes\").text;};"; }
          else if ( searchField == "tags" ) { getText = "tids[i].tags.join(\",\")"; }
          else { getText = "tids[i].fields." + searchField; }
        if ( getText != "" ) { haystacks.push(getText); }
        }
      }
    // get tiddlers tagged ref and look in designated fields for search terms
    var foundlings = [];
    var tids = store.getTaggedTiddlers("ref");
    for ( var i=0; i<tids.length; i++ ) {
      var haystack = "";
      for (var j=0; j<haystacks.length; j++) { haystack += eval(haystacks[j]) + " "; }
      if ( haystack.length > 0 ) { if ( flexMatch(needle,haystack,howSearch) ) { foundlings.push(tids[i].title); } }
      }
    // return any results
    if ( foundlings.length == 0 ) { alert ("No search results!"); } 
      else { foundlings = getUniqueArray(foundlings).sort(); showListResults("Search Results",foundlings); }
    }
  // if it's an advanced search, one of the other search term fields will be filled in
  else if ( form.rtitle.value != "" || form.alist.value != "" || form.abstract.value != "" || form.fjournal.value != "" || form.file.value != "" || form.tags.value != "" || form.notes.value != "" ) {
    var sFields = ["rtitle","alist","abstract","fjournal","file","tags","notes"];
    var foundlings = [];
    // determine if searching for all words, any words or phrase
    for ( var i=0;i<form.tType.length;i++ ) {
      if ( form.tType[i].checked ) { var howSearch = form.tType[i].value; break; }
      }
     // determine if searching for all or any field matches
    for ( var i=0;i<form.fType.length;i++ ) {
      if ( form.fType[i].checked ) { var howField = form.fType[i].value; break; }
      }
    //go through all ref tiddlers for each field
    var tids = store.getTaggedTiddlers("ref");
    for ( var i=0; i<tids.length; i++ ) {
      var matched = false;
      for ( var j=0; j<sFields.length; j++ ) {
        var needle = form.sFields[j].value;
        if ( needle != "" ) {
          if ( form.sFields[j].name == "notes" ) { haystack = store.getTiddler(tids[i].title+" Notes").text; }
            else { haystack = store.getValue(tids[i].title,form.sFields[j].name) };
          if ( flexMatch(needle,haystack,howSearch) ) {
            matched = true;
            if ( howField == "or" ) { break; }
            }
          else { if ( howField == "and" ) { break; } }
          }
        }
      if ( matched ) { foundlings.push(tids[i].title) }
      }
    // return any results
    if ( foundlings.length == 0 ) { alert ("No search results!"); } 
      else { foundlings = getUniqueArray(foundlings).sort(); showListResults("Search Results",foundlings); }
    }
  // if no search text is entered, just quit
  return false;
  }
//}}}

// // Use ILL to order current reference
//{{{
config.commands.orderMe = {
  text: 'order',
  hideReadOnly: false,
  tooltip: 'order current reference via ILL',
  handler: function(e) {
    if (!e) var e = window.event;
    var parent=story.findContainingTiddler(resolveTarget(e).parentNode);
    var title=parent.getAttribute('tiddler');
    var pmid = store.getValue(title,"pmid");
    if ( pmid == undefined || pmid == "" ) {
      var pmid = prompt("Enter PubMed PMID or blank for manual data entry", "");
      }
    if ( !(pmid == null || pmid == undefined || pmid == "") ) { config.macros.orderArticle.getData(pmid,parent) }
    else { config.macros.orderArticle.makePanel(parent) }
    e.cancelBubble = true;
    if (e.stopPropagation) e.stopPropagation();
    }
  };
//}}}

// // Toolbar images
//{{{
config.commands.editTiddler.imgLoc = "icons/editIcon.png";
config.commands.editTiddler.tooltip = "edit this page"
config.commands.closeTiddler.imgLoc = "icons/closeIcon.png";
config.commands.closeTiddler.tooltip = "close this page";
config.commands.saveTiddler.imgLoc = "icons/saveIcon.png";
config.commands.saveTiddler.tooltip = "save changes and view page";
config.commands.cancelTiddler.imgLoc = "icons/cancelIcon.png";
config.commands.cancelTiddler.tooltip = "discard changes";
config.commands.deleteTiddler.imgLoc = "icons/deleteIcon.png";
config.commands.deleteTiddler.tooltip = "delete this page";
config.commands.copyTiddler.imgLoc = "icons/copyIcon.png";
config.commands.copyTiddler.tooltip = "make a copy of this tiddler";
config.commands.showPDF.imgLoc = "icons/pdfbutton.png";
config.commands.showPDF.tooltip = "Show PDF for this reference";
config.commands.editRef.imgLoc = "icons/editdoc.png";
config.commands.editRef.tooltip = "Edit data for this reference";
config.commands.showNote.imgLoc = "icons/grayclip.png";
config.commands.showNote.tooltip = "Show notes page for this reference";
config.commands.closeRef.imgLoc = "icons/closeRefIcon.png";
config.commands.refreshMe.imgLoc = "icons/recycle.png";
config.commands.newRefTiddler.imgLoc = "icons/newRef.png";
config.commands.reloadTopics.imgLoc = "icons/recycle.png";
config.commands.searchRefs.imgLoc = "icons/search.png";
config.commands.orderMe.imgLoc = "icons/order.png";
//}}}
<<forEachTiddler
  where 'tiddler.tags.contains("LabTools")'
  sortBy 'tiddler.title'
  write '"[["+truncate(tiddler.title,23)+"|"+tiddler.title+"]]\n"'
  >>[[Primers|primers.htm]]

[[Tool index|ToolIndex]]
[[edit|ToolsStore]]
// // Create list of topics and subtopics
//{{{
config.macros.topicScan = {
  label: "Scan topics",
  prompt: "Scan notes, tags and files to identify and organize topics",
  handler: function(place) { createTiddlyButton(place,this.label,this.prompt,this.onClick); },
  onClick: function(e) { config.macros.topicScan.scanStart(); },
  scanStart: function() { 
    // get list of topics from files and tags
    var topicArray = [];
    var ignoreArray = store.getTiddler("IgnoreList").text.split("\n");
    var tids = store.getTaggedTiddlers("ref");
    for (var i=0; i<tids.length; i++) {
      var tempArray = subtractArrays(tids[i].tags,ignoreArray);
      topicArray = topicArray.concat(tempArray); 
      if ( tids[i].fields.file != undefined && tids[i].fields.file != "" ) { topicArray.push(tids[i].fields.file); }
      }

    //add list of topics from notes pages
    tids = store.getTaggedTiddlers("notes");
    for ( var i=0; i<tids.length; i++ ) {
      var tidTopics = tids[i].text.match(/\[[Tt]\[(.+?)\]\]/g)
      if ( tidTopics != null ) { topicArray = topicArray.concat(tidTopics); }
      }

    //clean up topic array, make unique and sort by topic and subtopic
    for ( var i=0; i<topicArray.length; i++ ) {
      topicArray[i] = topicArray[i].replace(/\[[Tt]\[/g,"");
      topicArray[i] = topicArray[i].replace(/\]\]/g,"");
      var tsplit = topicArray[i].split(":");
      tsplit[0] = tsplit[0].toLowerCase();
      topicArray[i] = tsplit.join(":");
      if ( topicArray[i].indexOf(":") == -1 ) { topicArray[i] += ":"; }
      }
    topicArray = getUniqueArray(topicArray);
    topicArray = topicArray.sort();

    //output to Topics tiddler
    var topicText = "";
    var lastTopic = "";
    for ( var i=0; i<topicArray.length; i++ ) {
      var ttemp = topicArray[i].split(":");
      var topic = ttemp[0];
      var subtopic = ttemp[1];
      if ( topic != lastTopic ) {
        if ( lastTopic != "" ) { topicText += "|\n"; }
        topicText += "|<<topicGen \"" + topic + "\">>|";
        }
      if ( subtopic != "" ) { topicText += "<<topicGen \"" + topic + "\" \"" + subtopic + "\">>"; }
      lastTopic = topic;
      }
    topicText += "|";
    store.setValue("Topics","text",topicText);
    story.displayTiddler(null,"Topics");
    }
};
//}}}

// // Function to generate a topic page
//{{{
config.macros.topicGen = {
  handler: function(place,macroName,params) {
    var topic = params[0];
    if ( params[1] ) { var subtopic = params[1]; var topicLabel = subtopic; } else { var topicLabel = topic; var subtopic = ""; }
    var topicPrompt = "Generate topic page for " + topicLabel;
    if ( params[2] ) { var buttonStyle = params[2]; } else { var buttonStyle = null; }
    var genBtn = createTiddlyButton(place,topicLabel,topicPrompt,this.onClick,buttonStyle);
    genBtn.setAttribute("topic",topic);
    genBtn.setAttribute("subtopic",subtopic);
    },
  onClick: function(e) {
    var ev = e || window.event;
    var genBtn = resolveTarget(ev);
    var topic = genBtn.getAttribute("topic");
    var subtopic = genBtn.getAttribute("subtopic");
    getTopic = config.macros.topicGen.genTopic(topic,subtopic);
    },
  genTopic: function(topic,subtopic) {
    var topicRefs = []; // array for a simple list of all refs tagged, filed or noted with this topic
    var topicSubText = []; // array for refs with tagged or with notes on a particular subtopic
    var topicSubs = []; // unique list of subtopics
    var topicSubRefs = []; // array to prevent duplicates within a subtopic

    // get notes on this topic
    var tids = store.getTaggedTiddlers("notes");
    var re = new RegExp("\n.*?\\[[Tt]\\[" + topic + ":(.*?)\\]\\].*?\\n","g");
    
    // get all matches within this tiddler's text into an array, then extract each match's subtopics and save text with no markers
    for ( var i=0; i<tids.length; i++ ) {
      var testText = "\n" + tids[i].text + "\n";
      var tidTopics = testText.match(re);
      if ( tidTopics != null ) {
        var pTitle = tids[i].title.split(" ");
        var pTid = store.getTiddler(pTitle[0]);
        topicRefs.push(pTid.title);
        var refLink = displayCitation(pTid,false);
        for ( var j=0; j<tidTopics.length; j++ ) {
          while ( tarray = re.exec(tidTopics[j]) ) {
            var subText = tidTopics[j].replace(/\[[Tt]\[.*?\]\]/g,"");
            subText = "***" + subText.replace(/\n/g,"");
            if ( tarray[1] != "" ) {
              topicSubs.push(tarray[1]);
              topicSubRefs.push(tarray[1] + "-" + pTid.title);
              subText = tarray[1] + subText;
              }
            else { subText = "aaageneral" + subText; }
            topicSubText.push(subText + " " + refLink);
            }
          }
        }
      }

    //get tags and files on this topic
    topicSubRefs = getUniqueArray(topicSubRefs);
    tids = store.getTaggedTiddlers("ref");
    re = new RegExp (topic + ":.*?\\,","g");
    for (var i=0; i<tids.length; i++) {
      if ( tids[i].fields.file != undefined && tids[i].fields.file.toLowerCase() == topic ) { topicRefs.push(tids[i].title); }
      if ( tids[i].tags.contains(topic) ) { topicRefs.push(tids[i].title); }
      var tagString = "," + tids[i].tags.join(",").replace(/[\[\]]/g,"") + ",";
      tidTopics = tagString.match(re);
      if ( tidTopics != null ) {
        topicRefs.push(tids[i].title);
        for ( var j=0; j<tidTopics.length; j++ ) {
          if ( tidTopics[j].indexOf(":") < tidTopics[j].length-1 ) {
            subText = tidTopics[j].substring(tidTopics[j].indexOf(":")+1,tidTopics[j].length-1);
            topicSubs.push(subText);
            if ( !topicSubRefs.contains(subText + "-" + tids[i].title) ) {
              subText += "zz***" +  displayCitation(tids[i],true);
              topicSubText.push(subText);
              }
            }
          }          
        }
      }

    // be sure lists of references and subtopics are unique, sort
    topicRefs = getUniqueArray(topicRefs).sort();
    topicSubs = getUniqueArray(topicSubs).sort();
    topicSubText = topicSubText.sort();

    // assemble text for topic tiddler
    var finalText = "";
    var lastTopic = "";
    for ( var i=0; i<topicSubText.length; i++ ) {
      var sTopic = topicSubText[i].split("***");
      var cTopic = sTopic[0];
      if ( !(lastTopic == cTopic || lastTopic + "zz" == cTopic) ) {
        finalText += "!!";
        if ( cTopic.indexOf("zz") > -1 ) { finalText += cTopic.substr(0,cTopic.length-2); }
          else if ( cTopic == "aaageneral" ) { finalText += "general"; }
          else { finalText += cTopic; }
        finalText += "\n";
        }
      finalText += "*" + sTopic[1] + "\n";
      lastTopic = cTopic;
      }

    finalText += "!!all references\n{{scrollList{\n";
    for ( var i=0; i<topicRefs.length; i++ ) { finalText += "*" + displayCitation(store.getTiddler(topicRefs[i]),true) + "\n"; }
    finalText += "}}}"
    store.setValue("TopicPage","text",finalText);
    store.setValue("TopicPage","topic",toProperCase(topic));
    story.displayTiddler(null,"TopicPage");
    if ( subtopic != "" ) { story.scrollToSection("TopicPage",subtopic); }
    }
  };
//}}}

// // Function to display authors, year, [title], icons - used in generating topic page
//{{{
function displayCitation(tid,addTitle) {
  var citeText = "[[" + tid.fields.sauthors + " (" + tid.fields.year + ")|" + tid.title + "]]";
  if ( addTitle ) {
    var title = tid.fields.rtitle.substr(0,50);
    if ( tid.fields.rtitle.length > 50 ) {
      var titleB = tid.fields.rtitle.substr(50,20);
      title += titleB.indexOf(" ") > -1 ? titleB.substr(0,titleB.indexOf(" ")) : titleB;
      title += "...";
      }
    citeText += " - " + title;
    }
  if ( store.tiddlerExists(tid.fields.ptid) ) { citeText += " [img[go to PDF|icons/spdf.png][" + tid.fields.ptid + "]]"; }
  if ( store.tiddlerExists(tid.fields.ntid) ) { citeText += " [img[go to notes|icons/clip.png][" + tid.fields.ntid + "]]"; }
  return citeText;
  };
//}}}

// //Formatter for topics in notes pages
//{{{
config.formatters.push({
  name:"topicnote",
  match:"\\[[Tt]\\[",
  lookaheadRegExp:/\[[Tt]\[(.+?)\:(.*?)\]\]/g,
  handler:function(w) {
    this.lookaheadRegExp.lastIndex=w.matchStart;
    var eMatch=this.lookaheadRegExp.exec(w.source);
    if(eMatch && eMatch.index==w.matchStart) {
      var topic = eMatch[1];
      if ( eMatch[2] ) { subtopic = eMatch[2]; } else { subtopic = ""; } 
      var btnParams = [topic,subtopic,"topicButton"];
      if ( place.lastChild != null && ( place.lastChild.localName == "ul" || place.lastChild.localName == "ol" ) ) { var putHere = place.lastChild.lastChild; }
        else { var putHere = place; }
      var eCreate=config.macros.topicGen.handler(putHere,"topicGen",btnParams);
      w.nextMatch=eMatch.index+eMatch[0].length;
      }
    }
  });
//}}}
!!amino-acid modification
*[[Davies et al. (1987)|Davies1987a]] - Protein damage and degradation by oxygen radicals.... [img[go to PDF|icons/spdf.png][Davies1987a.pdf]]
!!carbonyl
*"Introduction of carbonyl groups (aldehydes and ketones) into amino acid residues is a frequent consequence of protein oxidation, and these carbonyl groups are accepted as a marker of oxidative modification," detectable by derivatization by 2,4-dinitrophenylhydrazine. [[Cabiscol and Levine (1995)|Cabiscol1995]] [img[go to PDF|icons/spdf.png][Cabiscol1995.pdf]] [img[go to notes|icons/clip.png][Cabiscol1995 Notes]]
!!methioinine sulfoxide
*[[Cloos and Christgau (2002)|Cloos2002]] - Non-enzymatic covalent modifications of proteins: mechanisms,...
!!methionine sulfoxide
*[[Cabreiro et al. (2006)|Cabreiro2006]] - Methionine sulfoxide reductases: relevance to aging... [img[go to PDF|icons/spdf.png][Cabreiro2006.pdf]]
*[[Chao et al. (1997)|Chao1997]] - Modification of protein surface hydrophobicity and... [img[go to PDF|icons/spdf.png][Chao1997.pdf]]
*[[Hayes et al. (1998)|Hayes1998]] - In vitro and in vivo oxidation of methionine residues... [img[go to PDF|icons/spdf.png][Hayes1998.pdf]]
*[[Kim and Gladyshev (2007)|Kim2007]] - Methionine sulfoxide reductases: selenoprotein forms... [img[go to PDF|icons/spdf.png][Kim2007.pdf]]
!!paraquat
* RCAs impair cell functions by removing single electrons from carriers and redirecting them to new targets, disrupting e- flow and metabolism (e.g., oxidation of NADPH-reduced flavin cofactors depletes NADPH) [[Dietrich and Kiley (2011)|Dietrich2011]] [img[go to PDF|icons/spdf.png][Dietrich2011.pdf]] [img[go to notes|icons/clip.png][Dietrich2011 Notes]]
* Redox-cycling agents (RCAs) are small molecules readily reduced and re-oxidized under physiological conditions, including naturally occurring antibiotics (pyocyanin, lichexanthone, plumbagin) as well as artificial agents (paraquat) used as herbicides. [[Dietrich and Kiley (2011)|Dietrich2011]] [img[go to PDF|icons/spdf.png][Dietrich2011.pdf]] [img[go to notes|icons/clip.png][Dietrich2011 Notes]]
*[[Gu and Imlay (2011)|Gu2011]] - The SoxRS response of Escherichia coli is directly... [img[go to PDF|icons/spdf.png][Gu2011.pdf]] [img[go to notes|icons/clip.png][Gu2011 Notes]]
!!proteolysis
*[[Davies et al. (1987)|Davies1987c]] - Protein damage and degradation by oxygen radicals.... [img[go to PDF|icons/spdf.png][Davies1987c.pdf]]
!!resistance
*[[Nachin et al. (2005)|Nachin2005]] - Differential roles of the universal stress proteins... [img[go to PDF|icons/spdf.png][Nachin2005.pdf]]
!!soxS
*[[Shibuya et al. (2004)|Shibuya2004]] - Convenient and sensitive evaluation of a superoxide... [img[go to PDF|icons/spdf.png][Shibuya2004.pdf]]
!!all references
{{scrollList{
*[[Cabiscol and Levine (1995)|Cabiscol1995]] - Carbonic anhydrase III. Oxidative modification in vivo... [img[go to PDF|icons/spdf.png][Cabiscol1995.pdf]] [img[go to notes|icons/clip.png][Cabiscol1995 Notes]]
*[[Cabreiro et al. (2006)|Cabreiro2006]] - Methionine sulfoxide reductases: relevance to aging... [img[go to PDF|icons/spdf.png][Cabreiro2006.pdf]]
*[[Chao et al. (1997)|Chao1997]] - Modification of protein surface hydrophobicity and... [img[go to PDF|icons/spdf.png][Chao1997.pdf]]
*[[Cloos and Christgau (2002)|Cloos2002]] - Non-enzymatic covalent modifications of proteins: mechanisms,...
*[[Davies and Delsignore (1987)|Davies1987]] - Protein damage and degradation by oxygen radicals.... [img[go to PDF|icons/spdf.png][Davies1987.pdf]]
*[[Davies et al. (1987)|Davies1987a]] - Protein damage and degradation by oxygen radicals.... [img[go to PDF|icons/spdf.png][Davies1987a.pdf]]
*[[Davies (1987)|Davies1987b]] - Protein damage and degradation by oxygen radicals.... [img[go to PDF|icons/spdf.png][Davies1987b.pdf]]
*[[Davies et al. (1987)|Davies1987c]] - Protein damage and degradation by oxygen radicals.... [img[go to PDF|icons/spdf.png][Davies1987c.pdf]]
*[[Dietrich and Kiley (2011)|Dietrich2011]] - A shared mechanism of SoxR activation by redox-cycling... [img[go to PDF|icons/spdf.png][Dietrich2011.pdf]] [img[go to notes|icons/clip.png][Dietrich2011 Notes]]
*[[Fredriksson et al. (2005)|Fredriksson2005]] - Defense against protein carbonylation by DnaK/DnaJ... [img[go to PDF|icons/spdf.png][Fredriksson2005.pdf]]
*[[Fredriksson et al. (2006)|Fredriksson2006]] - Induction of the heat shock regulon in response to... [img[go to PDF|icons/spdf.png][Fredriksson2006.pdf]]
*[[Gu and Imlay (2011)|Gu2011]] - The SoxRS response of Escherichia coli is directly... [img[go to PDF|icons/spdf.png][Gu2011.pdf]] [img[go to notes|icons/clip.png][Gu2011 Notes]]
*[[Hayes et al. (1998)|Hayes1998]] - In vitro and in vivo oxidation of methionine residues... [img[go to PDF|icons/spdf.png][Hayes1998.pdf]]
*[[Kim and Gladyshev (2007)|Kim2007]] - Methionine sulfoxide reductases: selenoprotein forms... [img[go to PDF|icons/spdf.png][Kim2007.pdf]]
*[[Nachin et al. (2005)|Nachin2005]] - Differential roles of the universal stress proteins... [img[go to PDF|icons/spdf.png][Nachin2005.pdf]]
*[[Shibuya et al. (2004)|Shibuya2004]] - Convenient and sensitive evaluation of a superoxide... [img[go to PDF|icons/spdf.png][Shibuya2004.pdf]]
}}}
|<<topicGen "aggregation">>|<<topicGen "aggregation" "aging">><<topicGen "aggregation" "dnak">>|
|<<topicGen "aging">>|<<topicGen "aging" "oxidation">><<topicGen "aging" "proteolysis">>|
|<<topicGen "bacterial aging">>|<<topicGen "bacterial aging" "events">>|
|<<topicGen "chaperones">>||
|<<topicGen "competence">>||
|<<topicGen "epub">>||
|<<topicGen "evolution">>||
|<<topicGen "glycation">>||
|<<topicGen "grant">>|<<topicGen "grant" "aging">><<topicGen "grant" "oxidation">><<topicGen "grant" "protein damage">>|
|<<topicGen "heat shock">>|<<topicGen "heat shock" "DnaK">><<topicGen "heat shock" "oxidation">>|
|<<topicGen "isoaspartate">>|<<topicGen "isoaspartate" "crystallin">><<topicGen "isoaspartate" "deamidation">><<topicGen "isoaspartate" "effects">><<topicGen "isoaspartate" "extracellular matrix">><<topicGen "isoaspartate" "positive function">>|
|<<topicGen "lag phase">>||
|<<topicGen "oxidation">>|<<topicGen "oxidation" "ROS">><<topicGen "oxidation" "amino-acid modification">><<topicGen "oxidation" "carbonyl">><<topicGen "oxidation" "methionine sulfoxide">><<topicGen "oxidation" "paraquat">><<topicGen "oxidation" "proteolysis">><<topicGen "oxidation" "resistance">><<topicGen "oxidation" "soxS">>|
|<<topicGen "pcm">>|<<topicGen "pcm" "alzheimers">><<topicGen "pcm" "extracellular">><<topicGen "pcm" "medical">><<topicGen "pcm" "protein folding">>|
|<<topicGen "peptidyl-prolyl isomerase">>||
|<<topicGen "persisters">>||
|<<topicGen "projects">>|<<topicGen "projects" "RFP">><<topicGen "projects" "stasis">>|
|<<topicGen "proteases">>|<<topicGen "proteases" "pepA-D-N-Q">>|
|<<topicGen "protein damage">>|<<topicGen "protein damage" "covalent damage">>|
|<<topicGen "protein folding">>||
|<<topicGen "protein repair">>|<<topicGen "protein repair" "methionine">><<topicGen "protein repair" "peptidyl-prolyl">>|
|<<topicGen "proteolysis">>|<<topicGen "proteolysis" "oxidation">>|
|<<topicGen "solvent">>||
|<<topicGen "stationary phase">>|<<topicGen "stationary phase" "GASP">><<topicGen "stationary phase" "pcm">><<topicGen "stationary phase" "ppGpp">><<topicGen "stationary phase" "ribosome">><<topicGen "stationary phase" "rpoS">><<topicGen "stationary phase" "surA">>|
|<<topicGen "strain">>|<<topicGen "strain" "MG1">><<topicGen "strain" "SC28">><<topicGen "strain" "hipA7">><<topicGen "strain" "pKP3033">><<topicGen "strain" "pKP3035">><<topicGen "strain" "pSC228">><<topicGen "strain" "pSC3326">>|
|<<topicGen "stress responses">>|<<topicGen "stress responses" "heat">><<topicGen "stress responses" "osmotic">>|
|<<topicGen "stress">>|<<topicGen "stress" "pH">><<topicGen "stress" "usp">>|
|<<topicGen "techniques">>|<<topicGen "techniques" "chromosomal integration">><<topicGen "techniques" "methyltransferase">><<topicGen "techniques" "microfluidic">><<topicGen "techniques" "reporter">>|
|<<topicGen "toxin-antitoxin">>|<<topicGen "toxin-antitoxin" "relBE">>|
{{proctxt{
!!How it works
<<icap "[>img[Generalized transduction<br>(student.ccbcmd.edu/courses/bio141)|images/gentran.gif]]">>Many bacteriophages break up host DNA during their replication cycle. Some&mdash;''transducing phages'', such as phage P1 in //E. coli//&mdash;are not terribly picky about the DNA they package into the new phage particles, so they can inadvertently package a segment of the host genome instead of their own genome. When this happens, we have a phage that can [G[transduce|transduction]] a genome segment from one cell to another (lacking a genome, that phage cannot replicate in the new host). The transduced segment can then recombine into the chromosome, replacing [G[homologous|homologous]] genes. This procedure requires first preparing a P1 [G[lysate|lysate]] by growing P1~~//vir//~~```P1 //vir// is a mutant variant of phage P1 that has an increased frequency of transduction``` phage on the strain you want to transduce genes from. This procedure describes how to infect a new host with the phage so that the gene of interest is transduced into it.

!!Materials
{{proctab{
|[[MC buffer]]|0.5&times; culture volume for each recipient strain|
|[[Citrate buffer]]|0.1 ml per transduction|
|[[P1 lysate|Preparation of P1 vir liquid lysates]] from desired strain|10 &mu;l per transduction|
}}}
!!Procedure###Silhavy1984######Miller1972###
*Grow a 3-ml overnight culture of the recipient strain(s).
*Transfer 1 ml to a microcentrifuge tube and centrifuge 1 min. at full speed```This volume will be enough for 5 transductions; adjust volume if more are needed. Larger volumes can be spun in the Sorvall centrifuge at 1500 &times; //g// for 10 min.```
*Resuspend cells in 0.5 ml of MC buffer (or half the culture volume you started with, if different)
*Transfer 100 &mu;l of the resuspended recipient cells to a microcentrifuge tube for each transduction to be done.
*If strain and/or phage have not been tested previously, prepare a "phage control" tube with 100 &mu;l of phage only (no cells) and a "cell control" tube with 100 &mu;l of cells only (no phage). Neither should produce colonies.
*Add appropriate amount (start with 10 &mu;l```For most lysates, 10 &mu;l of phage should be sufficient for good transduction, but phage can be diluted further if excessive lysis occurs, or up to 100 &mu;l may be used if stock is of low titer.```) of [[P1 lysate|Preparation of P1 vir liquid lysates]] from donor strain and mix well.
*Incubate tubes in a 30 &deg;C waterbath for 30 min. without shaking. This allows time for the phage to bind and introduce DNA into the cells.
*Add 200 &mu;l of citrate buffer```Citrate is added to chelate the Ca^^2+^^ needed by the phage, blocking further replication of the phage, which could lead to excessive lysis. Some protocols use 100 or 200 &mu;l of 1M sodium citrate, but Miller recommends the gentler 0.1 M citrate buffer.``` to each tube and mix well.
*Some resistance genes (such as Tc and especially Km```Recessive antibiotic-resistance alleles, such as StrR and RifR, require a longer period to allow segregation of the alleles as well as expression; these should be grown for four hours in LB broth plus citrate or plated by the double-overlay method.```) require time for phenotypic expression __before__ plating on selective media. If you are transducing one of these genes, add 1 ml of LB broth and incubate at 37 &deg;C without shaking for 1 hour```If excessive killing occurs during the phenotypic expression period, an alternative is to plate in top agar on plates lacking antibiotic, incubate for several hours, and then overlay soft agar containing sufficient antibiotic to give the desired final concentration in the total plate volume.```.
*Spread desired amount of transduction mixture (start with 100 &mu;l) on selective plates```The transduction mixture can also be added to 2.5 ml of molten top agar and plated.``` and incubate at 37 &deg;C```Transductants can also be plated on LB agar containing 5 mM citrate (and buffered with minimal salts ([[LBC agar]]) to further reduce reinfection.```.
}}}
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'><span macro='titleIcon'></span></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
Notes [L[Hicks2006|pubget Hicks AND Visick]] here
// //Formatter for image with caption
// //    syntax: {{{[1>i(w,h)[caption:path]]}}} where 1 is 1 for border, 0 for no border, > floats right, < floats left (omit for no float)
//{{{
config.formatters.push({
  name:"imagecap",
  match:"\\[[0-9]{0,1}[><]{0,1}[Ii](?:\\([^,]*,[^\\)]*\\))?\\[",
  lookaheadRegExp:/\[([0-9]{0,1})([><]{0,1})[Ii](?:\(([^,]*),([^\)]*)\))?\[(.+?)\]\]/g,
  handler:function(w) {
    this.lookaheadRegExp.lastIndex=w.matchStart;
    var eMatch=this.lookaheadRegExp.exec(w.source);
    if(eMatch && eMatch.index==w.matchStart) {
      var iborder = eMatch[1];
      var ipos = eMatch[2];
      var iwidth = eMatch[3];
      var iheight = eMatch[4];
      var ipath = eMatch[5];
      var icap = "";
      if ( ipath.indexOf("|") > -1 ) {
         icap = ipath.substr(0,ipath.indexOf("|"));
         ipath = ipath.substr(ipath.indexOf("|")+1); 
       }
      var iclass = "imgWrap";
      if ( ipos == "<" ) { iclass += " iLeft"; }
      if ( ipos == ">" ) { iclass += " iRight"; }
      if ( !iborder == "" && iborder == 0 ) { iclass += " iNoBord"; }
      var idiv = createTiddlyElement(w.output,"div",null,iclass);
      var iImg = createTiddlyElement(idiv,"img");
      iImg.src = ipath;
      if ( iwidth || iheight ) {
        if ( iwidth ) { iImg.style.width = iwidth.trim() + "px"; } else { iImg.style.width = "auto"; } 
        if ( iheight ) { iImg.style.height = iheight.trim() + "px"; } else { iImg.style.height = "auto"; }
        iImg.oriHt = iImg.style.height;
        iImg.oriWd = iImg.style.width;
        iImg.title = "SHIFT-CLICK=show full size, CTRL-CLICK=restore original size";
        iImg.onclick = function (ev) { if (ev.ctrlKey) { iImg.style.width = iImg.oriWd; iImg.style.height = iImg.oriHt; } if (ev.shiftKey) { iImg.style.width = iImg.naturalWidth + "px"; iImg.style.height = iImg.naturalHeight + "px"; } };
        }
      if ( icap != "" ) {
        icap = wikifyStatic(icap,null,null);
        var cdiv = createTiddlyElement(idiv,"div",null,"iCap");
        cdiv.innerHTML = icap;
        }
      w.nextMatch=eMatch.index+eMatch[0].length;
      }
    }
  });
//}}}

// // Formatter for linkout to external reference in text
// // Syntax: {{{[L[link URL]]}}}
//{{{
config.formatters.push({
  name:"linkout",
  match:"\\[[Ll]\\[",
  lookaheadRegExp:/\[[Ll]\[(.+?)\]\]/g,
  handler:function(w) {
    this.lookaheadRegExp.lastIndex=w.matchStart;
    var eMatch=this.lookaheadRegExp.exec(w.source);
    if(eMatch && eMatch.index==w.matchStart) {
      var linkSource = eMatch[1];
      var linkParams = [linkSource,"linkoutButton"];
      var eCreate=config.macros.linkoutGen.handler(place,"linkoutGen",linkParams,w);
      w.nextMatch=eMatch.index+eMatch[0].length;
      }
    }
  });
config.macros.linkoutGen = {
  handler: function(place,macroName,params,w) {
    var linkSource = params[0];
    var linkout = createTiddlyElement(w.output,"a",null,"linkout","");
    linkout.href = linkSource;
    }
  };
//}}}

// // Formatter for glossary popup link
// // Syntax: {{{[G[text|glossary term]]}}}
//{{{
config.formatters.push({
  name: "glossary",
  match: "\\[[Gg]\\[",
  lookaheadRegExp: /\[[Gg]\[(.+?)\]\]/g,
  handler: function(w) {
    this.lookaheadRegExp.lastIndex=w.matchStart;
    var eMatch=this.lookaheadRegExp.exec(w.source);
    if(eMatch && eMatch.index==w.matchStart) {
      if ( eMatch[1].indexOf("|") > -1 ) {
        var glossText = eMatch[1].substr(0,eMatch[1].indexOf("|"));
        var glossLookup = eMatch[1].substr(eMatch[1].indexOf("|")+1);
        }
      else {
        var glossText = eMatch[1];
        var glossLookup = glossText;
        }
      var gText = createTiddlyElement(w.output,"span",null,"glossText","");
      var gWik = wikify(glossText,gText,null,null);
      var gLink = createTiddlyElement(w.output,"span",null,"glossLink","");
      gLink.anno = store.getTiddlerSlice("Glossary",glossLookup);
      gLink.subject = glossText;
      gLink.onmouseover = this.onmouseover;
      gLink.onmouseout = this.onmouseout;
      gLink.ondblclick = this.onmouseout;
      w.nextMatch=eMatch.index+eMatch[0].length;
      }
    },
  onmouseover: function(e) {
    popup = createTiddlyElement(document.body,"div",null,"glossPop");
    this.popup = popup;
    if (this.subject) { wikify ("!" + this.subject + "\n",popup); }
    wikify(this.anno,popup);
    addClass(this,"glossSubOver");
    var popHeight = this.popup.offsetHeight;
    var popWidth = this.popup.offsetWidth;
    var winHeight = findWindowHeight();
    var winWidth = findWindowWidth();
    var mouseY = e.pageY;
    var mouseX = e.pageX;
    var popTop = mouseY + 6;
    var popLeft = mouseX + 6;
    if ( mouseY + popHeight >= winHeight - 20 ) { popTop = popTop - popHeight - 12; }
    if ( mouseX + popWidth >= winWidth - 20 ) { popLeft = popLeft - popWidth -12; }
    this.popup.style.top = popTop + "px";
    this.popup.style.left = popLeft + "px";
    this.popup.style.display = "block";
    },
  onmouseout: function(e) {
    removeNode(this.popup);
    this.popup=null;
    removeClass(this,"glossSubOver");
    }
  });
//}}}

// // Macro to show/hide main menu
//{{{
  config.macros.menuButtons = {
    handler: function (place) {
      var menuList = store.getValue("menuButtons","text").split("\n");
      for ( var i=0; i<menuList.length; i++ ) {
        var menuName = menuList[i];
        var buttonID = menuName + "Button";
        createTiddlyElement(place,"span",buttonID,"menuBtn",menuName);
        buttonID = "#" + buttonID
        jQuery(buttonID).bind('click', {val: menuName}, function(event) {openMenu(event.data.val)});
        }
      currentMenu = "";
      }
    };

  function openMenu(menuName) {
    var menuID = "#" + menuName + "Button";
    var oldID = "#" + currentMenu + "Button";
    if ( menuName == "MainMenu" ) { 
      var menuLabel = "Main Menu";
      if ( config.options.admIn ) { var storeTiddler = "AdminMenuStore"; } else { var storeTiddler = "MainMenuStore"; }
      }
    else { 
      var menuLabel = menuName; 
      var storeTiddler = menuName + "Store";
      }
    var labelText = "{{menuTitle{" + menuLabel + "}}}\n{{menuText{\n";
    if ( currentMenu == menuName ) {
      jQuery('#mainMenu').hide(); // hide the menu
      jQuery(menuID).css({'border': '1px solid #666', 'background-color': '#999'}); // remove shown menu color
      jQuery('#tiddlerDisplay').css({'margin-left': '5px'}); // shrink the left margin for the displayed tiddlers
      jQuery('#tiddlersBar').css({'margin-left': '0'}); // shrink the left margin for the tab bar
      currentMenu = "";
      }
    else if ( currentMenu == "" ) {
      store.setValue("MainMenu","text",labelText + store.getValue(storeTiddler,"text") + "\n}}}");
      jQuery('#mainMenu').show(); // show the menu
      jQuery(menuID).css({'border': '1px solid #999', 'background-color': '#666'}); // add shown menu color
      jQuery('#tiddlerDisplay').css({'margin-left': '153px'}); // push displayed tiddlers right
      jQuery('#tiddlersBar').css({'margin-left': '146px'}); // push tab bar right
      currentMenu = menuName;
      }
    else {
      store.setValue("MainMenu","text",labelText + store.getValue(storeTiddler,"text") + "\n}}}");
      refreshDisplay();
      jQuery(menuID).css({'border': '1px solid #999', 'background-color': '#666'}); // add shown menu color
      jQuery(oldID).css({'border': '1px solid #666', 'background-color': '#999'}); // remove shown menu color
      currentMenu = menuName;
      }
    }
//}}}

// // Macro to place icon in title bar based on tags (as listed in [[TitleIcons]])
//{{{
  config.macros.titleIcon = {
    handler: function (place) {
      var tags = tiddler.tags.join(" ").toLowerCase();
      var iconTags = findAllSlices("TitleIcons");
      for ( var i in iconTags ) {
        var tagTest = i.replace(/\_/g," ").toLowerCase();
        if ( tags.indexOf(tagTest) > -1 ) {
          var ti = createTiddlyElement(place,"img",null,"titleIcon",null);
          ti.src = iconTags[i];
          break;
          }
        }
      }
    };
//}}}

// // Macro to create "topics box"
//{{{
  config.macros.topicBox = {
    handler: function (place) {
      var tags = tiddler.tags;
      var topicTag = "";
      for ( var i=0; i<tags.length; i++ ) {
        var match = /:[0-9]{1,}/.exec(tags[i]);
        if ( match != null ) { topicTag = tags[i].substr(0,tags[i].indexOf(":")); break; }
        }
      if ( topicTag != "" ) {
        var tids = store.getTiddlers("title");
        var re = new RegExp(topicTag + ":([0-9]{1,})");
        var topicList = [];
        for ( var i=0; i<tids.length; i++ ) {
          var test = tids[i].tags.join(",");
          var match = re.exec(test);
          if ( match != null ) {
            var topicNo = parseInt(match[1]);
            if ( topicNo < 10 ) { topicNo = "0" + topicNo; }
            topicList.push(topicNo + "-" + tids[i].title);
            }
          }
        topicList = topicList.sort();
        var tTitle = createTiddlyElement(place,"p",null,"tTitle",topicTag + " Topics:");
        var tItems = createTiddlyElement(place,"ul",null,"tItems",null);
        for ( var i=0; i<topicList.length; i++ ) {
          if ( topicList[i].substr(3) == tiddler.title ) {
            var tItem = createTiddlyElement(tItems,"li",null,"tHi",topicList[i].substr(3));
            }
          else {
            var tItem = createTiddlyElement(tItems,"li",null,null,null);
            createTiddlyLink(tItem,topicList[i].substr(3),true,null);
            }
          }
        }
      else { return false; }
      }
    };
//}}}

// // randomImage macro - pick a random image when a page is rendered: {{{<<rotateImage imageTiddler left|right>>}}}
//{{{
config.macros.randomImage= {
  handler: function(place,macroName,params) {
    var imageTiddler = params[0];
    var floatDir = params[1];
    var imageList = store.getValue(imageTiddler,"text").split("\n");
    var showImage = imageList[Math.floor(Math.random()*(imageList.length))];
    var imgDiv = createTiddlyElement(place,"div","rndImgDiv",null,null);
    jQuery("#rndImgDiv").css("float",floatDir);
    if ( floatDir == "left" ) { jQuery("#rndImgDiv").css("margin-right","8px"); } else {jQuery("#rndImgDiv").css("margin-left","8px"); }
    var theImg = createTiddlyElement(imgDiv,"img","rndImg",null,null);
    theImg.src = showImage.substr(0,showImage.indexOf("::"));
    var theCap = wikify("<br>"+showImage.substr(showImage.indexOf("::")+2),imgDiv);
    }
  }
//}}}

// // login function
//{{{
function logMeIn(passCode) {
  if ( passCode == "9911110810582117108101115" || passCode == "991111081058211710810111533") {
    config.options.loggedIn = true;
    if ( passCode == "991111081058211710810111533" ) { config.options.admIn = true; }
    config.options.chkSinglePageMode = false;    // Allow display of multiple tiddlers
    store.setValue("cornerBox","text",store.getValue("searchBoxStore","text"));
    currentMenu = "";
    openMenu("MainMenu");
    story.forEachTiddler(function(t,e) { story.refreshTiddler(t,null,true) });
    if (!readOnly) { saveChanges(); }
    refreshAll();
    }
  else {
    alert ("Sorry, you don't seem to know the password.");
    }
  };
//}}}
Visick lab wiki
<<search>>
pimages/ahn.png::Sarah Ahn ('12)
pimages/boci.png::T&eacute;a Boci ('08)
pimages/bussell.png::Amber Cibrario ('09) and Adam Bussell ('07)
pimages/byrd.png::Caila Byrd ('12)
pimages/connolly.png::Casey Connolly ('08)
pimages/crampton.png::Lyndsey Crampton ('03)
pimages/derosa.png::Katelyn DeRosa ('13)
pimages/flinn.png::Nicole Flinn ('07)
pimages/hicks.png::Wade Hicks ('02)
pimages/hill.png::Lindsay Hill ('05)
pimages/hinckley.png::Erin Hinckley ('12)
pimages/kleehammer.png::Dani Kleehammer ('08)
pimages/kotlajich.png::Matt Kotlajich ('03)
pimages/mcneal.png::Brianne McNeal ('06)
pimages/peiffer.png::Megan Peiffer ('07)
pimages/peterson.png::Heather Peterson ('08)
pimages/rakhno.png::Eugenia Rakhno ('08)
pimages/salim.png::Madiha Salim ('06)
pimages/shah.png::Bhumika Shah ('06)
pimages/shulla.png::Ana Shulla ('04)
pimages/sorenson.png::Matt Sorenson ('07)
pimages/thomas.png::Toni Thomas ('03)
pimages/visick.png::Jon Visick with Toni Thomas ('03)
pimages/vujnic.png::Sanda Vujnic ('04)
pimages/winslow.png::Tori Winslow ('11)
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewListToolbar]]'></div>
<div class='title'>
  <span macro='view title wikified'></span>
  <span class='filterBar''>
    <form class='filterForm'>
      <input type='text' id='filter' class='searchField' />
      <a class='searchButton' id='filterButton'>Filter</a>
      <input type='checkbox' name='limReviews' />show only reviews
      &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<i>(click headers to sort)</i>
    </form>
  </span>
</div>
<div class='viewer' macro='view text wikified'>
<div id='results' macro='showList'></div>
</div>
<div class='tagClear'></div>
<!--}}}-->
<html>
<form class='logForm'><input id='loginPass' type='password' class='logField' value=''><input type='button' value='log in' id='loginButton' class='logButton'></form>
</html>
<script>
  var lb = document.getElementById("loginButton");
  lb.onclick = function () {
    var lt = document.getElementById("loginPass");
    var tryPass = lt.value;
    var codePass = "";
    for ( var i = 0; i<tryPass.length; i++ ) {
      codePass += tryPass.charCodeAt(i);
      }
    lt.value = "";
    logMeIn(codePass);
    };
  jQuery('#loginPass').keypress(function(event) {
    if ( event.keyCode == 13 ) { event.preventDefault(); jQuery('#loginButton').click(); }
    });
</script>
MainMenu
Projects
Protocols
Recipes
Tools
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditNoteToolbar]]'></div>
<div class='title' macro='view title wikified'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
{{box{
''You need to log in as a current research student to view this page.''
}}}
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title wikified'><span macro='titleIcon'></span></div>
<div class='viewer'>
  <div macro='showWhen (tiddler.tags.contains("private") && !config.options.loggedIn)'><span macro='tiddler privatePage'></span></div>
  <div macro='hideWhen (tiddler.tags.contains("private") && !config.options.loggedIn)'>
    <div macro='view text wikified'>
      <div class ='refBox'>
        <div class='keyBox' macro='tiddler Key'></div>
        <div macro='topicBox' id='topicBox'></div>
      </div>
    </div>
  </div>
</div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title wikified'></div>
<div class='FormGroup'>
  <span class='FormLabel'>Authors</span><span class='FormEdit mega' macro='edit alist'></span><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
  <span class='FormLabel'>Brief Authors</span><span class='FormEdit maxi' macro='edit sauthors'></span>&nbsp;&nbsp;
  <span class='FormLabel'>File</span><span class='editor refedit' macro='select file@here +FileList allowEdit rows:1 width:150px; autoSave allowBlank'></span><span macro='checkbox paper@' style='vertical-align: text-bottom'>hard copy only&nbsp;</span><br>
  <span class='FormLabel'>Title</span><span class='FormEdit mega' macro='edit rtitle'></span>
</div>
<div class='FormGroup'>
  <span class='FormLabel'>Journal (full name)</span><span class='FormEdit maxi' macro='edit fjournal'></span>&nbsp;&nbsp;
  <span class='FormLabel'>(abbreviated)</span><span class='FormEdit maxi' macro='edit journal'></span><br>
  <span class='FormLabel'>Volume</span><span class='FormEdit mini' macro='edit vol'></span>&nbsp;&nbsp;
  <span class='FormLabel'>Issue</span><span class='FormEdit mini' macro='edit issue'></span>&nbsp;&nbsp;
  <span class='FormLabel'>Pages</span><span class='FormEdit' macro='edit pages'></span>
  <span class='FormLabel'>Year</span><span class='FormEdit' macro='edit year'></span><br>
  <span class='FormLabel'>Publication type</span><span class='FormEdit' macro='edit pubtype'></span>&nbsp;&nbsp;
  <span class='FormLabel'>PMID</span><span class='FormEdit' macro='edit pmid'></span>&nbsp;&nbsp;
  <span class='FormLabel'>PMC</span><span class='FormEdit' macro='edit pmc'></span>&nbsp;&nbsp;
  <span class='FormLabel'>DOI</span><span class='FormEdit' macro='edit doi'></span><br>
  <span class='FormLabel'>Note tiddler</span><span class='FormEdit' macro='edit ntid'></span>&nbsp;&nbsp;
  <span class='FormLabel'>PDF tiddler</span><span class='FormEdit' macro='edit ptid'></span>
</div>
<div class='FormGroup'>
  <span class='FormLabel'>Abstract</span><span class='FormEdit' macro='edit abstract 5'></span>
</div>
<div class='FormGroup'>
  <span class='FormLabel'>Last author and contact</span><span class='FormEdit mega' macro='edit adr'></span><br>
  <span class='FormLabel'>Short citation</span><span class='FormEdit mega' macro='edit scite'></span><br>
  <span class='FormLabel'>Full citation</span><span class='FormEdit mega' macro='edit fcite'></span>
</div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
<!--{{{-->
<div class='topborder'></div>
<table class='reftable'><tr><td class='leftstuff'>
<div class='reftitle' macro='view rtitle wikified'></div>
<div class='refdetails'>
     <div class='cols2'>
     <span macro='view sauthors wikified'></span> (<span macro='view year wikified'></span>)<br>
     <span macro='view jlink wikified'></span><br>
     <span macro='refShow pubtype'></span><span macro='refShow pmid'></span>
     <span macro='showWhen !tiddler.fields.pmid'>
         <span class='reffield' macro='edit pmid'>PMID: </span>
     </span>
     <span macro='showWhen (!tiddler.fields.pmid||tiddler.fields.pm!=1)'>
         &nbsp;&nbsp;&nbsp;<span class='smbutton' macro='getPMID'></span>
     </span>
     </div>
     <div class='cols2'>
     tags:&nbsp;&nbsp;<span class='refedit' macro='edit tags 2'></span>
     <div class='editorFooter tfoot'>
         <span macro='message views.editor.tagPrompt'></span><span class='tchoose' macro='tagChooser excludeLists'></span>
     </div>
     file:&nbsp;<div class='editor refedit' macro='select file@here +FileList allowEdit rows:1 width:150px; autoSave allowBlank'>
     </div>&nbsp;&nbsp;&nbsp;<span macro='checkbox paper@' style='vertical-align: text-bottom'>hard copy only&nbsp;</span>
     </div>
</div>
</td><td class='rightstuff'>
<div macro='showWhen !(tiddler.fields.file==undefined||tiddler.fields.file=="")'>
<div class='toolbox' macro='toolbar [[ToolbarCommands::ViewRefToolbar]]'></div>
</div>
<div macro='showWhen (tiddler.fields.file==undefined||tiddler.fields.file=="")'>
<div class='toolbox' macro='toolbar [[ToolbarCommands::ViewRefToolbar2]]'></div>
</div>
</td></tr></table>
<div class='abstract' macro='view abstract wikified'></div>
<div class='aform'></div>
<div macro='tiddler setIcon'></div>
<div class='mbs'><span class='showMore' macro='showMore'></span><span class='showLess' macro='showLess'></span></div>
<div class='fullCite'>
  <span macro='view fcite wikified'><b>Full citation</b>: </span>
  <span macro='view adr wikified'><b>Last author and PubMed contact data</b>: </span>
  <span macro='refShow fjournal'></span>
  <span macro='refShow pubget'></span>
  <span macro='refShow pmc'></span>
  <span macro='refShow doi'></span>
</div>
<div class='tagClear'></div>
<!--}}}-->
<<search>>
<script>
var title = story.findContainingTiddler(place).getAttribute("tiddler");
var tid = store.getTiddler(title);
if ( !store.tiddlerExists(tid.fields.ptid) ) {
  jQuery("a[commandname='showPDF']").children("img").attr("src", "icons/pdfbuttondim.png");
  }
if ( !store.tiddlerExists(tid.fields.ntid) ) {
  jQuery("a[commandname='showNote']").children("img").attr("src", "icons/nonotes.png");
  }
</script>
<script label="run">
  var th = jQuery("#tiddlersBar").css("padding-top");
  document.write(th)
</script>
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title wikified'><span macro='titleIcon'></span></div>
<div class='viewer'>
  <div macro='showWhen (tiddler.tags.contains("private") && !config.options.loggedIn)'><span macro='tiddler privatePage'></span></div>
  <div macro='hideWhen (tiddler.tags.contains("private") && !config.options.loggedIn)'>
    <div macro='view text wikified'>
      <div class ='refBox'>
        <div class='keyBox' macro='tiddler Key'></div>
        <div macro='topicBox' id='topicBox'></div>
      </div>
    </div>
  </div>
</div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='blockTOC'>
  <div class='toolbar toolbarTOC' macro='toolbar [[ToolbarCommands::TopicViewToolbar]]'></div>
  <span class='sectionTOC'></span>
</div>
<div class='topicTopborder'></div>
<div class='topicTitle' macro='view topic wikified'></div>
<div class='viewer' macro='view text wikified'></div>
<span macro='sectionTOC'>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::TopicToolbar]]'></div>
<div class='title'><span macro='view title wikified'></span></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->