// Help for Molecule Information Tab (also much of it is in moltab.js) // debug through # 6 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function makeOccupanciesAltLoc() { var oal = ''; var oalmin = Math.round(100. * occAltLocMin); var oalmax = Math.round(100. * occAltLocMax); if (!altLocCount || occAll100) return "."; var occslink = 'occupancies'; if (occAltLocConstant) { oal += ', all with ' + occslink + ' of ' + oalmin + "%."; } else { oal += ' with ' + occslink + ' of ' + oalmin + "-" + oalmax + "%."; } return oal; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function makeOccupanciesSummary() { var occsum = ""; var occlink = "Occupancy"; // no atoms without altlocs if (!jmolEvaluate("{%}.count")) return occsum; // all atoms 100% occupancy if (occAll100) { occsum += occlink + " is 100% for all atoms."; return occsum; } var range; // NAL = Not AltLoc (We've already returned blank if NAL==0) if (occNALConstant) range = '(namely ' + Math.round(100. * occNALMin) + '%) '; else range = '(range ' + Math.round(100. * occNALMin) + '-' + Math.round(100. * occNALMax) + '%) '; // SOME OCC < 100% if (!altLocCount) // all atoms lack altLocs { occsum += occlink + " is <100% " + range + "for " + numberWithCommas(occ0to991Loc) + " atoms (" + occ0to991LocPct + "% of " + numberWithCommas(allAtomM1C1Count) + " total atoms)."; } else // for the remaining non-altlocs (all the single-location atoms) { var forRemaining = " for the remaining " + numberWithCommas(allAtomM1C1Count - altLocC1Count) + " atoms."; if (occNALConstant && (occNALMin == 1.0)) occsum += occlink + " is 100% " + forRemaining; else { var orange; if (occNALConstant) orange = "" + Math.round(100. * occNALMin) + "%"; else orange = "" + Math.round(100. * occNALMin) + "-" + (100. * occNALMax) + "%"; occsum += occlink + ' is ' + orange + forRemaining; } } return (occsum); } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function makeOccupancyReport() { return(makeOccupancyReport2()); // No longer necessary since I decided not to include the column with locations/atom. // See getLPA() /* if (!altLocCount) return(makeOccupancyReport2()); if (!altLocFreqsGotten) { setTimeout("getAltLocFreqs('')", 50); return altLocOneMoment; } else return(makeOccupancyReport2()); */ } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ var POWALNonWater; var POWALWater; function makeOccupancyReport2() { // INTRODUCTION var occrep = "
Occupancy
"; var altloclink1 = "alternate locations."; var altloclink2 = "alternate locations in this model."; var atloc = 's'; // when no AltLocs 'atoms' if (altLocCount) atloc = ' locations'; 'atom locations' if (altLocCount) occrep += 'In the Atom location counts below, ' + 'every location will be counted for atoms with ' + altloclink1 + ' The location count will exceed the number of atoms in a single conformation.'; // else // there are no altlocs // occrep += 'Since there are no atoms with alternate locations here, ' + // 'counts of atom locations are equal to counts of atoms.'; occrep += "

"; if (occAll100) occrep += "All atoms have 100% occupancy in this model."; else { occrep += "" + numberWithCommas(occ0to99) + " atom" + atloc + " in this model (" + occ0to99Pct + "% of " + atomLocationsCount + " total atom" + atloc + ") have partial occupancies."; // List All occrep += ' ' + '' + ' List all .'; } occrep += "

"; if (match(expMethod, "nmr")) occrep += 'This model was determined by NMR. The occupancy value has no standard meaning for \ NMR results, and is usually set uniformly to 1.0 (100%). \

\ The following information applies to X-ray crystallographic models. \

\ \ '; occrep += 'Sometimes the \ electron density map from \n\ X-ray crystallography \n\ resolves two (or more) locations for a single atom (or amino acid side chain). This means that \n\ the atom occupies alternate locations in \n\ different copies of the molecule in the crystal. In such a case, each location \n\ has partial occupancy, and the occupancies for all locations should sum to 1.0 (100%). \n\

\n\ In some cases*, particularly for water oxygens, only one location may be given, \n\ but assigned partial occupancy based on the intensity of the electron density map. \n\ '; if (altLocCount == 0) occrep += "

There are no atoms with " + altloclink2; else occrep += "

See also " + altloclink2; if (!occAll100) occrep += makeOccupanciesTables(); // EXAMPLES occrep += "

Examples:'; return occrep; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function makeOccupanciesTables() { var occrep = ''; // NON-WATER OCCUPANCY occrep += '

For '; if (altLocCount == 0) occrep += numberWithCommas(allAtomM1C1Count - waterCount) + ' non-water atoms'; else occrep += numberWithCommas(nonWaterLocationsCount) + ' non-water atom locations'; occrep += ":\n
\n"; var inModel1 = ""; if (modelCount > 1) inModel1 = " in model 1"; // occrep += inModel1 + ""; occVal.length = occCount.length = 0; //occList = jmolEvaluate("{model=1 and not water}.occupancy.all.sort"); ALPHAFolD occList = jmolEvaluate("{not water}.occupancy.all.sort"); occList = fixJmolList(occList); countOccupancies(); var clickocc = ""; // We already know !occAll100, but one of the 2 tables may have only occ=1.0 // if (occVal[0] != "1.0") // { clickocc += '1. Optional: \ Show All** Non-Water Atoms, '; clickocc += "then
\ 2. Click on occupancy values below to Find the corresponding atoms. "; if (toFind != "") { clickocc += 'Scroll to the top of this panel to see the Find query. '; clickocc += '
Clear Halos
'; } // else // clickocc += '

'; clickocc += "Touching or clicking on an atom will report its occupancy."; // } occrep += makeOccTable("not water", clickocc); // <<<<< TABLE // alert("help1.js #1 occVal[0] = " + occVal[0] + "\n occVal.length = " + occVal.length); // alert("help1.js #1a typeof(occVal[0]) = " + typeof(occVal[0])); STRING // WATER OCCUPANCY var wml = "water molecules"; var wlc = numberWithCommas(waterCount); if (altLocCount > 0) { wml = "water molecule locations"; wlc = numberWithCommas(waterLocationsCount); } if (waterCount == 0) occrep += "

There is no water in this model.

"; else { occrep += '
For ' + wlc + ' ' + wml + inModel1 + ""; // if (altLocWaterCount > 0) // occrep += "
(including water in alternate" + // " locations)"; occrep += ":\n
\n" occVal.length = occCount.length = 0; //occList = jmolEvaluate("{model=1 and water}.occupancy.all.sort"); // alphafold occList = jmolEvaluate("{water}.occupancy.all.sort"); occList = fixJmolList(occList); countOccupancies(); clickocc = ""; // We already know !occAll100, but one of the 2 tables may have only occ=1.0 // if (occVal[0] != "1.0") // { clickocc += '1. Show All Atoms** Including Water, '; clickocc += "then
\ 2. Click on occupancy values below to Find the corresponding atoms. "; clickocc += "Touching or clicking on an atom will report its occupancy."; } occrep += makeOccTable("water", clickocc); // } // END WATER // BEGIN PARTIAL OCCUPANCY WITHOUT ALTLOC // POWAL: Partial Occupancy Without Alternate Locations occrep += '

'; if (occAll100) occrep += '*No atoms in this model have partial occupancy.

'; else if ((POWALNonWater + POWALWater) == 0) occrep += '*No atoms in this model have partial occupancy without alternate locations.

'; else { if (POWALNonWater == 0) { occrep += '*\ Find all ' + POWALWater + ' atoms that have ' + 'partial occupancies without alternate locations.'; occrep += " In this model, all of them are water atoms.

"; } else { occrep += "*Find all atoms that have partial occupancy without alternate locations:" + ''; } } if (match(expMethod, "nmr")) occrep += "
"; if (occ0to99 > 0) occrep += '**The above "Show All" views are the same as \n\ Vines/Sticks in the Views tab, with More detail \n\ and Hide Hydrogen checked.'; return occrep; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function occView(mode) { // mode: occNonWater, occNonWaterNoH, occWater, // ALNonWater, ALNonWaterNoH, ALWater (AL = AltLoc) var vv = mode; var hh = mode.charAt(0); if (hh == "A") { if (match(mode, "noh")) mode = "occNonWaterNoH"; else if (match(mode, "nonwater")) mode = "occNonWater"; else mode = "occWater"; } doViewNoHelp(mode); // mode must be occ... if (hh == "o") showOccupancyReport(); else // AL showAltLocHelp(); } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function findPOWALWater() { findOccupancy("water and altloc='' and occupancy < 1.0"); // all models } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function findPOWALNonWater() { findOccupancy("altloc='' and occupancy < 1.0 and not water"); } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ var occTableColorKeyDone = false; var allowOccCompress = true; var occTableColorKey; function makeOccTable(subset, clickhelp) { var occrep = ""; var col3 = ""; var col3head = ""; var rowcount = occVal.length; var lpa; var doFifths = false; if (rowcount > 8) doFifths = true; var compress = false; if (rowcount > 12 && allowOccCompress) compress = true; if (occVal.length > 1) rowcount++; // add row for "All < 1.0" getALCodes(); // array of altloc codes ALCodes[] occTableColorKeyDone = false; var colorkey = '' + coloredElements1 + '' + ' more elements.. ' + ''; if (match(currentView, "vine")) { col3head = "Color Key"; col3 = ''; col3 += colorkey; // guarantee one var max = rowcount/5; if (compress) max = 1; for (var cki = 2; cki <= max; cki++) { if (cki > 1) col3 += "








"; col3 += colorkey; } col3 += ''; } occTableColorKey = col3; var ac = "Atom Count"; if (altLocCount > 0) ac = "Atom Location Count"; // BEGIN TABLE occrep += '
' + '' + '' + // '' + '' + '' + col3head + ''; var range0, range2, range4, range6, range8 = false; for (i=0; i < occVal.length; i++) { // Insert <1.0 before 1.0 if (occVal[i] == 1.0 && occVal.length > 2) { if (compress) { if (!range0) // there are none in range0 {occrep += insertFifth(0.01, 0.20, subset); range0 = true;} if (!range2) occrep += insertFifth(0.21, 0.40, subset); range2 = true; if (!range4) occrep += insertFifth(0.41, 0.60, subset); range4 = true; if (!range6) occrep += insertFifth(0.61, 0.80, subset); range6 = true; if (!range8) occrep += insertFifth(0.81, 0.99, subset); range8 = true; } allocc = occ0to99NonWater; if (subset == "water") allocc = occ0to99Water; occrep += ''; occrep += ''; occrep += ''; } // Insert ranges: Fifths if (compress) { if (occVal[i] >= 0.81 && !range8) { if (!range0) // there are none in range0 {occrep += insertFifth(0.01, 0.20, subset); range0 = true;} if (!range2) occrep += insertFifth(0.21, 0.40, subset); range2 = true; if (!range4) occrep += insertFifth(0.41, 0.60, subset); range4 = true; if (!range6) occrep += insertFifth(0.61, 0.80, subset); range6 = true; occrep += insertFifth(0.81, 0.99, subset); range8 = true; } else if (occVal[i] >= 0.61 && !range6) { if (!range0) // there are none in range0 {occrep += insertFifth(0.01, 0.20, subset); range0 = true;} if (!range2) occrep += insertFifth(0.21, 0.40, subset); range2 = true; if (!range4) occrep += insertFifth(0.41, 0.60, subset); range4 = true; occrep += insertFifth(0.61, 0.80, subset); range6 = true; } else if (occVal[i] >= 0.41 && !range4) { if (!range0) // there are none in range0 {occrep += insertFifth(0.01, 0.20, subset); range0 = true;} if (!range2) occrep += insertFifth(0.21, 0.40, subset); range2 = true; occrep += insertFifth(0.41, 0.60, subset); range4 = true; } else if (occVal[i] >= 0.21 && !range2) { if (!range0) // there are none in range0 {occrep += insertFifth(0.01, 0.20, subset); range0 = true;} occrep += insertFifth(0.21, 0.40, subset); range2 = true; } else if (occVal[i] >= 0.01 && !range0) {occrep += insertFifth(0.01, 0.20, subset); range0 = true;} } if (!compress || occVal[i] == 0.0 || occVal[i] == 1.0) { // Occupancy value linked occrep += ''; // Locations/atom // lpa = getLPA(occVal[i], subset); // occrep += ''; occrep += ''; // Count for this occupancy value occrep += ''; // Optional color key column 3 if (i == 0) {occrep += col3; occTableColorKeyDone = true;} occrep += ''; } } if (compress) { occrep += ''; occrep += ''; } if (!allowOccCompress) { occrep += ''; occrep += ''; } occrep += '
' + clickhelp + '
OccupancyLocations
per Atom
AltLoc Codes
' + ac + '
All < 1.0' + getOccAltLocs("occupancy<1.0", subset) + '
' + numberWithCommas(allocc) + '
' + occVal[i] + '' + lpa +'' + getOccAltLocs("occupancy=" + occVal[i], subset) + '
' + numberWithCommas(occCount[i]) + '
' + 'List all ' + occVal.length + ' individual occupancy values.
' + 'List only five ranges of occupancy values.
'; return occrep; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function insertFifth(low, high, subset) { var fif = ''; var occrange = "occupancy >= " + low + " and occupancy <= " + high; fif += '' + low + '-' + high.toFixed(2) + ''; fif += '' + getOccAltLocs(occrange, subset) + ''; var orc = jmolAtomCountAllConfigs(subset + ' and ' + occrange); fif += '
' + numberWithCommas(orc) + '
'; // alert(occTableColorKeyDone); // alert(occTableColorKey); if (!occTableColorKeyDone) { fif += occTableColorKey; occTableColorKeyDone = true; } fif += ''; return fif; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function getOccAltLocs(occ, subset) // occval includes = or < + value { var ovl = '' if (jmolAtomCountAllConfigs(occ + " and % and " + subset)) ovl += 'None'; // alert("help1.js #4a: ALCodes.length=" + ALCodes.length + " ALCodes=" + ALCodes); if (altLocCount) { for (var alci = 0; alci < ALCodes.length; alci++) { var occal = occ + " and %" + ALCodes[alci] + " and " + subset; var occalcount = jmolAtomCountAllConfigs(occal); // alert("help1.js #4: occal=" + occal + "\noccalcount=" + occalcount); if (occalcount) { if (ovl.length) ovl += ','; ovl += ALCodes[alci]; } } } return ovl; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // I think this is working, tested for FGiJ 2.85, but // I don't think its useful. Very confusing. Blank when no altloc codes. /* function getLPA(occval, subset) { // subset is "water" or "not water" var lpa = ''; var ocount = new Array(); var oi = 0; var occsub = (jmolEvaluate("{!% and occupancy=" + occval + " and " + subset + "}.count")) // alert("help1.js #3a: occval=" + occval + " subset=" + subset + " freq=" + occsub); if (occsub) { for (var xi = 1; xi <= 5; xi++) { ocount[xi] = jmolEvaluate("{occupancy=" + occval + " and ~altloc" + xi + "list and " + subset + "}.count"); // if (occval == 0.5) // alert("help1.js #3: occval=" + occval + " lpa=" + xi + " ocount[xi]=" + ocount[xi]); if (ocount[xi]) { if (oi) lpa += ","; lpa += xi; oi++; } } } return lpa; } */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function findOccupancy(query) { // findNoHelp(query + " #allconformations"); // in findOccupancy() findNoHelp(query); // in findOccupancy() showOccupancyReport(); // refresh help to add "Halos around:" at top. } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function clearOccupancy() { clearFindNoHelp(); showOccupancyReport(); // refresh help to remove "Halos around:" at top. } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function showOccupancyReport() { cancelPendingAndShowHelp("makeOccupancyReport()"); } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - var occList = []; var occVal = []; var occCount = []; function countOccupancies() { var prev; var oi = -1; for (var i = 0; i < occList.length; i++) { if (occList[i] != prev) { oi++; // occVal.push(occList[i]); occVal[oi] = occList[i]; occCount.push(1); } else { occCount[occCount.length-1]++; } prev = occList[i]; } } //- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - function fixJmolList(list) { var newList = []; var ni = 0; newList [0] = ""; for (i=0; i < list.length; i++) { if (list[i] != "\n") newList[ni] += list[i]; else { ni++; newList[ni] = ""; } } newList.length = newList.length - 1; return newList; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function makeElementsReport() { var erep = "
Chemical Elements
"; erep += "
This model contains the following chemical elements. The atom count " + "is given for each."; erep += '

'; gotSe = false; for (i=0; i < elementSymbols.length; i++) { var ees = elementSymbols[i]; var b1 = b2 = ""; if (ees != "C" && ees != "H" && ees != "O" && ees != "N" && ees != "P" && ees != "S") { b1 = ""; b2 = ""; } erep += ''; } erep += '
' + b1 + elementSymbols[i] + b2; if (elementSymbols[i] == "Se") { erep += "*"; gotSe = true; } erep += '' + numberWithCommas(elementCounts[i]) + '
'; erep += "
Click on an element to Find it.

"; if (gotSe) erep += '*For more about selenium, click on Disulfides/S/Se.. ' + 'in the Tools tab.'; if (mseCount) erep += ' This model contains ' + mseLink + 'selenomethoinine (MSE).'; if (gotSe || mseCount) erep += '

'; erep += 'Examples with >10 elements: \ 4kav, \ 3eqc, \ 1ihu. \
Examples with unknown elements Unx: \ 2awp, \ 2dyr. \ '; erep += '

Related: ' + 'Composition (Views tab), ' + 'Molecular Masses, ' + 'and ' + 'Hydrogen. '; erep += showHNonHCounts(); return erep; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function showElementsReport() { cancelPendingAndShowHelp("makeElementsReport()"); } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ var save4SpreadsheetSB = "
This tab-delimited list, saved as a text file, can be \ imported into a spreadsheet for sorting \ (see details at bottom below).
\ Save the file as text. Drag and drop it onto the spreadsheet icon, or File, Import.
\ (To save this page so it can be viewed in a web browser, File, Save As, Web Page, Complete.)

"; var save4SpreadsheetOC = "
This tab-delimited list, saved as a text file, can be \ imported into a spreadsheet for sorting.
\ Save the file as text. Drag and drop it onto the spreadsheet icon, or File, Import.
\ (To save this page so it can be viewed in a web browser, File, Save As, Web Page, Complete.)

"; function listPartialOccupancy() { var pol = "ATOMS WITH PARTIAL OCCUPANCY IN "; // alert("help1.js #2 modelCount = " + modelCount); if (modelCount > 1) pol += "MODEL 1 OF "; if (validPDBId != "") pol += validPDBId + "."; else pol += "
" + pdbURL; pol += save4SpreadsheetOC; pol += "SeqNo = Sequence Number.
"; pol += "Ins = Insertion Code for sequence number (usually blank).
"; pol += "AltLoc = Alternate Location ID.
"; pol += "Occ = Occupancy.
"; pol += "Temp = Temperature (B factor).
"; pol += "

"; // pol += "x\ty"; // YES TABS WORK pol += "Count\tGroup\tSeqNo\tIns\tChain\tElement\tAtom\tAltLoc\tOcc\tTemp
"; // pol += jmolEvaluate('{occupancy<1.0}.label("%3n\t%4R\t%3E\t%3c\t%4e\t%a\t%3A\t%3.2Q\t%3.2t")'); // The following script line run manually crashes Java applet 14.3.16_2014.08.21 in FGiJ, // but not JSmol in FGiJ. When "List All" is run in Java applet FGiJ, the report is ERROR. // but "List All" works in JSmol. // Script does not crash Jmol app. It does not crash Java applet at St Olaf. // Note added FGiJ 2.5: try this without WAIT!! // jmolScriptWait('listAllPartialOccupancies=' + // can use runBareSpt if add test and don't use Wait jmolScript('listAllPartialOccupancies=' + '{occupancy<1.0}.label("%3n\t%4R\t%3E\t%3c\t%4e\t%a\t%3A\t%3.2Q\t%3.2t")'); pol += jmolEvaluate('{*}.atomIndex.all[1][listAllPartialOccupancies.length].' + 'add(1).format("%5i").join(listAllPartialOccupancies).join("\t",true)'); alert("Look for the report in a separate\nbrowser tab or window.\n" + "Pop-ups must not be blocked for this site."); showSptInWindow(pol) } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ var listSBPart1; /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function listSaltBridges() { var pol1 = "PROTEIN-PROTEIN SALT BRIDGES IN "; if (modelCount > 1) pol1 += "MODEL 1 OF "; if (validPDBId != "") pol1 += validPDBId + "."; else pol1 += "
" + pdbURL; pol1 += '
Listing by FirstGlance ' + 'in Jmol.'; pol1 += "
LIGAND-PROTEIN AND NUCLEIC-PROTEIN SALT BRIDGES ARE NOT LISTED."; pol1 += "
ONLY PROTEIN-PROTEIN SALT BRIDGES ARE LISTED."; pol1 += "
Salt bridges involving ligands+ or nucleic acids can be visualized using " + "Contacts & Non-Covalent Interactions.. or Ends.. (Tools tab)."; pol1 += "

"; var pol3 = ""; var missingCharged = parseInt(missingNeg) + parseInt(missingPos); if (missingCharged) { pol3 += missingCharged + " charged amino acids that were present in the " + "preparation whose structure was determined are " + 'missing in this model. '; } if (incompleteChargedSidechainsProteinCount) { if (pol3.length) pol3 += "
"; pol3 += incompleteChargedSidechainsProteinCount + " amino acids in this model with charged sidechains have atoms missing in their sidechains " + '(Sidechains, incomplete; marked S-). '; } if (pol3.length) { pol3 += "
Salt bridges involving these residues are absent from the list below. "; pol3 += "

"; pol3 = '' + pol3 + ''; } pol1 += pol3; pol1 += "Salt bridges are defined here as oppositely charged atoms ≤4.0 Å apart"; pol1 += "

(Jeffrey, George A., An introduction to hydrogen bonding. "; pol1 += "Oxford Univ. Press, 1997. Page 192.)
"; pol1 += save4SpreadsheetSB; pol1 += "Count = Number of nitrogen atoms engaged in salt bridges, including those " + "with alternate locations.
" + repeat(" ", 3) + "(The atom count in the lower left panel in FirstGlance " + "excludes atoms with alternate locations.)
"; pol1 += "SeqNo = Sequence Number.
"; pol1 += "Ins = Insertion Code for sequence number (usually blank).
"; pol1 += "Chain: Oxygen anion chain is Bold* for between-chain bridges.
"; pol1 += "Atom:
"; pol1 += repeat(" ", 3) + "SIDECHAINS: OD = Oxygen Delta; NE, OE = Nitrogen or Oxygen Epsilon; NH = Nitrogen Eta; " + "NZ = Nitrogen Zeta.
"; pol1 += repeat(" ", 3) + "CHAIN TERMINI: N, O, OXT are main chain atoms. " + '(C for C-termini lacking 1 oxygen: ' + '' + 'more information.)
'; pol1 += "AltLoc = Alternate Location ID (usually blank).
"; pol1 += "DIST = Distance in Å between salt-bridged atoms.
" + repeat(" ", 3) + "When the C-terminus lacks one oxygen: " + "distance between the cationic nitrogen and the terminal carboxy carbon.
"; // getHiddenTot(); //alert(hiddenTot); if (hiddenTot > 0 || isolatedDescription != "") { pol1 += '
'; pol1 += "Only salt bridges with visible nitrogen cations are listed.
" + "Salt bridges are NOT listed for the portions of the model whose nitrogen cations
" + "are not visible due to Hide or Isolate operations.
"; pol1 += '
'; } listSBPart1 = pol1; // GENERATE TABLE BODY AND STATS IN JMOL jmolScript("listSB();listSBStats();"); setTimeout("listSaltBridges2()", 100); } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function listSaltBridges2() { var pol2 = ""; // TABLE HEADER 1 pol2 += "
\t\tNITROGEN CATIONS\t\t\tDIST\t\t\tOXYGEN ANIONS\t\t\tNOTES
"; // HORIZONTAL BARS pol2 += repeat("―", 54) + "\t\t" + repeat("―", 46);; // TABLE HEADER 2 pol2 += "
Count\tGroup1\tSeqNo1\tIns1\tChain1\tAtom1\tAltLoc1\t" + "\tGroup2\tSeqNo2\tIns2\tChain2\tAtom2\tAltLoc2
"; // TABLE BODY pol2 += jmolEvaluate("sblist + sbliststats"); // FOOTNOTES BELOW TABLE if (pol2.indexOf("1 oxygen") != -1) pol2 += 'For C-termini lacking 1 oxygen, ' + 'distances ≤ 5.2 Å are between ' + '
the C-terminal carboxy carbon, C, and the cationic nitrogen, ' + '
and are excluded from the above statistics.
'; if (match(pol2, "*")) pol2 += "
* " + jmolEvaluate("sbintercount") + " atom pairs in salt bridges between chains (inter-chain salt bridges)."; else pol2 += "
No salt bridges are between chains. All are within chains."; pol2 += "
" + jmolEvaluate("sbpaircount") + " total atom pairs in salt bridges."; pol2 += "
" + jmolEvaluate("sbtermcount") + ' atom pairs in salt bridges containing charged protein ' + 'chain terminus atoms.'; if (pol2.indexOf("1 oxygen") != -1) pol2 += '

§ C-terminus ' + 'lacking one oxygen, with carboxy ' + 'carbon ≤ 5.2 Å from a cation: ' + 'More information. ' + '
Distances (carboxy carbon to cationic nitrogen) are excluded from the above average, ' + 'minimum, and maximum. '; pol2 += "
" + repeat("―", 110) + "
" + "EXCEL suggestions:
" + " - Save this page as text. Drag and drop it onto the spreadsheet icon, or File, Import.
" + " - Delete text above and below the table of columns.
" + " - Auto-set all column widths: Select entire sheet (Ctrl-A or Cmd-A), double click on any
" + "\tcolumn boundary in the row of column letters at the top.
" + " - Delete blank rows: Select the Group1 column (click on column B at the top).
" + "\tIn the Home tab, open Find & Select, click on Go to Special...,
" + "\tcheck Blanks, OK. Right click on a selected cell, Delete..., Entire row.
" + " - Delete all asterisks (*): Edit menu at top, Find..., Replace....
" + "\tEnter ~* (tilde asterisk) in the Find slot, and nothing in the Replace slot. Replace all."; alert("Look for the report in a separate\nbrowser tab or window.\n" + "Pop-ups must not be blocked for this site."); showSptInWindow(listSBPart1 + pol2); } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ var dipeptideCount; function alertUnusual(halou) { reportElapsed("alertUnusual(halou) started (help1.js)"); // going to consurf, back to fg controls should not alert every time if (unusualAlerted) return(""); unusualAlerted = true; // ALERT unconditionally if alpha carbons only, nucleic P only var abbo = ""; if (proteinAlphaCarbonsOnly) abbo += "Only alpha carbon atoms are\npresent in the protein in this model."; if (nucleicPhosphorusOnly) { if (abbo.length > 0) abbo += "\n\n"; abbo += "Only backbone phosphorus atoms are\npresent in the nucleic acid chains here."; } if (abbo.length > 0) alert(abbo); // BEGIN LIST OF UNUSUALS // uu is alerted only if preferenceSayUnusual var uu = ''; var daacount = jmolAtomCount("~d_aa_ca"); // alpha carbons of D amino acids if (daacount) uu += 'Model contains ' + daacount + ' D amino acids.\n'; if (jmolAtomCount("T and RNA")) // for alert Unusual uu += 'Model contains ribo-T.\n'; if (jmolAtomCount("U and DNA")) // for alert Unusual uu += 'Model contains deoxyribo-U.\n'; if (jmolAtomCount("GLX,ASX")) // for alert Unusual uu += 'Model contains ASX or GLX.\n'; if (jmolAtomCount("*.x??")) // for alert Unusual uu += 'Model contains unknown atoms X.\n'; if (jmolAtomCount("unx,unk")) // for alert Unusual uu += 'Model contains unknown atoms or groups UNX or UNK.\n'; if (jmolAtomCount("[n]")) // for alert Unusual uu += 'Model contains unknown nucleotides "N".\n'; if (jmolAtomCount("[unl]")) // for alert Unusual uu += 'Model contains unknown ligands "UNL".\n'; if (jmolAtomCount("~anomalous_atoms")) // for alert Unusual uu += 'Model contains anomalous atoms.\n'; if (jmolAtomCount("~nobackbone_aas")) // for alert Unusual uu += 'Model contains amino acids missing alpha carbons.\n'; if (jmolAtomCount("~unbondable_aas")) // for alert Unusual uu += 'Model contains amino acids missing peptide-bonding atoms.\n'; if (jmolAtomCount("~nomainchaino_aas")) // for alert Unusual uu += 'Model contains amino acids missing main chain oxygens.\n'; var saa; if (saa = jmolAtomCount("~unchained_aas and *.ca")) // for alert Unusual { var ss = ""; if (saa > 1) ss = "s"; uu += 'Model contains ' + saa + ' single amino acid' + ss + ', not peptide bonded, ' + 'listed/clickable under\n' + ' Ligands+ and Non-Standard Residues (Molecule Information Tab).\n'; } if (jmolAtomCount("~hydroxy_unchained_nucs")) // for alert Unusual uu += 'Model contains single nucleoSides, not in a chain of standard nucleotides,\n' + ' listed/clickable under\n' + ' Ligands+ and Non-Standard Residues (Molecule Information Tab).\n'; if (jmolAtomCount("~unchained_nucs")) // for alert Unusual uu += 'Model contains single nucleoTides, not in a chain of standard nucleotides,\n' + ' listed/clickable under\n' + ' Ligands+ and Non-Standard Residues (Molecule Information Tab).\n'; // ~unchained_x is not alerted as Unusual if (jmolAtomCount("~cyclic_nucs")) // for alert Unusual uu += 'Model contains cyclic nucleotides.\n'; if (jmolAtomCount("^?")) // for alert Unusual uu += 'Model contains sequence insertion codes.\n'; if (jmolAtomCount("resno<1")) // for alert Unusual uu += 'Model contains zero or negative sequence numbers.\n'; if (dipeptideCount = jmolAtomCount("~dipeptides and *.ca")) // for alert Unusual { dipeptideCount /= 2; var ss = ""; if (dipeptideCount > 1) ss = "s"; uu += 'Model contains ' + dipeptideCount + ' dipeptide ligand' + ss + ', listed/clickable under\n' + ' Ligands+ and Non-Standard Residues (Molecule Information Tab).\n'; } uu += unusualIsopeptideMsg; uu += unusualThioesterMsg; uu += unusualThioetherMsg; uu += unusualEsterMsg; uu += unusualHisTyrMsg; uu += unusualNOSBMsg; // if (altLocCount) // see getAltLoc() for why can't use jmolAtomCount which already has config=1 // uu += 'Model contains ' + altLocCount + ' atoms with alternate locations.\n'; // COMPLETE THE REPORT if (uu) { // SHOW RED "U" document.getElementById("redu").src="imgs/20px-redu.png"; if (preferenceSayUnusual) { uu = "UNUSUAL COMPONENTS OR FEATURES:\n\n" + uu; uu += "\nOK for explanation, or Cancel for none."; if (halou) uu += "\nALL UNUSUAL COMPONENTS OR FEATURES WILL BE HALOED."; else uu+= "\n\nCLICK THE RED \"U\" BELOW THE MOLECULE\nTO PUT HALOS ON THESE COMPONENTS/FEATURES."; if (reportElapsedTimes) reportElapsed("alertUnusual(halou) done (alert suppressed) (help1.js)"); else if (confirm(uu)) window.open("notes.htm#unusual"); } else // preferencesSayUnusual false { if (crosslinksExist) { clm = "Unusual protein crosslinks are present.\n" + "OK to list them. Cancel to explore them later.\n" + "Later, click the red U below the molecular view."; if (confirm(clm)) { showCrosslinkHelpList(); } } } } else reportElapsed("alertUnusual(halou) done, help1.js (nothing unusual found)"); return (uu); // return is only for if(alertUnusual()) } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function reiterateUnusual() // called only when red U is clicked. { oldpref = preferenceSayUnusual; preferenceSayUnusual = false; // preparation to toggle on unusualAlerted = false; // otherwise alertUnusual() does nothing. // true = halo ~all_unusual togglePreferenceSayUnusual(true); // toggles preference true, sets cookie, alertUnusual(), halos // false = don't find->halos if (!oldpref) togglePreferenceSayUnusual(false); // restores pref and cookie to false } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function showCrosslinkHelp() { showHelp("makeCrosslinkHelp()"); // sets helpPanel to same as string. } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ var crosslinkType; // same as xtype. var previousCrosslinkType = ""; var xCount; // Count of crosslink bonds. var xName; // Name of crosslink, e.g. "Isopeptide". var xPpda; // URL to Proeopedia article on this type of crosslink. var xIffy; // putative or possible var showCrosslinkLabels = true; // default var xLinxCount = 0; // visible cross-links. var xHiddenCount = 0; // hidden cross-links. var crosslinkValidation = '*The ' + 'distance-based detection methods\n\ are intentionally broad. ' + 'Check for geometry, appropriateness and lengths (see above) of covalent bonds, ' + 'and how well the electron density map supports the atom positions. ' + 'PDB files do not specify most covalent bonds. Jmol draws covalent bond sticks \n\ wherever two atoms are close enough (≤1.81 Å for C, N, O), \n\ and not when they are too far apart. '; function makeCrosslinkHelp() { xtype = crosslinkType; switch (xtype) { case "i": xName = "Isopeptide"; xCount = isopeptideCount; xPpda = "https://proteopedia.org/w/Isopeptide_bond"; xIffy = "Putative"; xres = isopeptideResidues; xatoms = isopeptideAtoms; xdist = isopeptideDistances; break; case "t": xName = "Thioester"; xCount = thioesterCount; xPpda = "https://proteopedia.org/w/Thioester_protein_crosslinks"; xIffy = "Putative"; xres = thioesterResidues; xatoms = thioesterAtoms; xdist = thioesterDistances; break; case "h": xName = "Thioether"; xCount = thioetherCount; xPpda = "https://proteopedia.org/w/Thioether_protein_crosslinks"; xIffy = "Putative"; xres = thioetherResidues; xatoms = thioetherAtoms; xdist = thioetherDistances; break; case "e": xName = "Ester"; xCount = esterCount; xPpda = "https://proteopedia.org/wiki/index.php/Ester_protein_crosslinks"; xIffy = "Putative"; xres = esterResidues; xatoms = esterAtoms; xdist = esterDistances; break; case "y": xName = "His-Tyr"; xCount = histyrCount; xPpda = "https://proteopedia.org/wiki/index.php/Histidine-tyrosine_protein_crosslinks"; xIffy = "Putative"; xres = histyrResidues; xatoms = histyrAtoms; xdist = histyrDistances; break; case "n": xName = "Lys-Cys NOS"; xCount = NOSBCount; xPpda = "https://proteopedia.org/w/Lysine-cysteine_NOS_bonds"; xIffy = "Possible"; xres = NOSBResidues; xatoms = NOSBAtoms; xdist = NOSBDistances; break; } // End switch // Crosslinks Title iph = "
" + xName + '(?) ' + 'Crosslinks

'; var xlinx = ""; // Collect individual bond links. var clinx = ""; // Bond cluster links. xLinxCount = 0; // Count of visible xlinks. var xvis = ""; // for "visible" xHiddenCount = 0; // count of hidden bonds // GENERATE BOND/BOND CLUSTER LINKS xlinx if (xCount) { // Generate xlinx for (iir = 1; iir <= xCount; iir++) { var atbond = xres[iir]; // FORMAT [GLN]211:F, [SPD]1223:F var selbond = atbond; var isCluster = match(atbond, " or "); if (!isCluster) { // get atoms ipa = xatoms[iir]; atom1 = ipa.substring(0, ipa.indexOf(" ")); atom2 = ipa.substring(ipa.indexOf(" ") + 1); //alert("|" + atom1 + "|" + atom2 + "|"); // atbond: Insert atoms BEFORE colons (NOT LEGAL JMOL SYNTAX) icolon = atbond.indexOf(":"); atbond = atbond.substring(0, icolon) + "." + atom1 + atbond.substring(icolon); icolon = atbond.lastIndexOf(":"); atbond = atbond.substring(0, icolon) + "." + atom2 + atbond.substring(icolon); //alert("help1.js #5: atbond=" + atbond); // atbond IS NOT LEGAL JMOL FORMAT [GLN]211.CD:F, [SPD]1223.N1:F // selbond: Insert atoms AFTER chains (LEGAL JMOL for selection) icomma = selbond.indexOf(","); selbond = selbond.substring(0, icomma) + "." + atom1 + selbond.substring(icomma); selbond = selbond + "." + atom2; // COMMA FAILS IN {...}, USE OR selbond = selbond.replace(/, /, " or "); //alert(selbond); // COUNT HIDDEN BONDS toeval = "{(" + selbond + ") and not ~hidden_jdef}.count"; //alert("help1.js #6:\njmolEvaluate(" + toeval + ")\n" + jmolEvaluate(toeval)); if (jmolEvaluate(toeval) < 2) { xHiddenCount++; continue; // DON'T ADD HIDDEN BONDS TO xlinx } // Change colons to " Chain ". atbond = atbond.replace(/:/g, " Chain "); if (!isCluster) { // Change ", " to " to ". atbond = atbond.replace(/, /, "   to   "); } // Single bond links in xlinx if (!isCluster) { xlinx += '
  • ' + atbond + ': ' + xdist[iir] + ' Å' + '
  • '; xLinxCount ++; } else // isCluster { clinx += '
  • ' + atbond + '
  • '; xLinxCount ++; } } // end for loop if xCount: xlinx & clinx now complete. if (clinx.length) { clinx = 'Bond Clusters§
    ' + clinx; } if (xHiddenCount) xvis = "Visible "; // Add link for ALL if (xLinxCount > 1) { xlinx += '
  • All ' + xvis + 'Putative ' + xName + ' Bonds
  • '; } // Emphasize some hidden if (xHiddenCount) xlinx += "(" + xHiddenCount + ' ' + ((xHiddenCount == 1) ? 'bond is':'bonds are') + ' HIDDEN.)
    '; // LABELS // If this is the first display of crosslinks, label them. if (currentView != "renderCrosslink") {showCrosslinkLabels = true;} // If we are already showing crosslinks, add checkboxes. if (xCount && currentView == "renderCrosslink" && xtype == previousCrosslinkType) { // If we're showing a single crosslink: if (currentCrosslinkIndex) // Not when showing "All" crosslinks. { // Slab toggle initbut = "up"; if (toggleIsDown[slabIndex]) {initbut = "down";} toggleIndex = slabIndex + 200; // none for cptab 1, 10 for cptab 2, 100 for molinfo tab. xlinx += "" + "<\/a> " + "Slab to declutter." + '  Slab settings.
    '; // End Slab toggle } // Hide labels checkbox even when all xlinks shown. cksil = " checked "; if (showCrosslinkLabels) {cksil = "";} xlinx += ' \ Hide labels.'; // If we're showing a single crosslink: if (currentCrosslinkIndex) // Not when showing "All" crosslinks. { // Neighbors toggle cksin = ""; if (showCrosslinkNeighbors) {cksin = " checked ";} xlinx += '
    \ Show 4.0 Å neighbors† of this bond.'; // Electron density. cf. crosslinkType, currentCrosslinkIndex, xres[]. // href="javascript: execution order is left to right. if (hasMap) xlinx += '
    ' + '' + cap1only(mapName) + ' Density Map.'; xlinx += '
    This view shows only the crosslinking residues, not ' + 'their covalent and non-covalent interactions with neighbors. ' + 'For those, check "4.0 Å neighbors" above, or go to Contacts\n\ & Non-Covalent Interactions (Tools tab), and check "Atoms with halos". \n'; } // End of showing a single crosslink } // End of "already showing crosslinks" checkboxes. } // End if xCount. xlinx is now COMPLETE. //alert(xlinx); /* // Report FAILURE if it occurred due to partner count mismatches. if ((xtype == "i" && failIsopeptides) || (xtype == "t" && failThioesters) || (xtype == "h" && failThioethers) || (xtype == "e" && failEsters) || (xtype == "y" && failHisTyr) || (xtype == "n" && failNOSB)) { iph += 'Detection of ' + xName + ' bonds FAILED. ' + 'This is usually due to clashes (atoms being impossibly close together) in the model.
    '; } else // Detection did not fail. */ // { @@@ if (xLinxCount) { iph += xIffy + '* ' + '' + xName + ' bonds ' + 'are present in this model. '; if (match(getMethod(), "electron microscopy")) { iph += 'CAUTION: Models determined by electron microscopy sometimes have many ' + 'clashes or bond lengths too long to be detected. ' + 'Examples. '; } if (xHiddenCount) iph += '' + xLinxCount + ' ' + ((xLinxCount == 1) ? 'is':'are') + ' visible. ' + '' + xHiddenCount + ' ' + ((xHiddenCount == 1) ? 'is':'are') + ' HIDDEN. '; iph += 'Detection criteria are intentionally broad, and sometimes report \n\ clashes'; // period space below. if (xtype == "i" || // Isopeptide xtype == "t" || // thioester // "h" thioether no clash example found. xtype == "e" || // ester xtype == "y" || // his-tyr xtype == "n") // NOS iph += ' (example below‡). '; if (xtype == "n") // NOS iph += 'See validation examples. '; /* // CLASH examples at top of crosslinks help. if (xtype == "i") // Isopeptide iph += ' (example: 3ic8‡). '; else if (xtype == "t") // thioeSTer iph += ' (example: 5d12‡). '; // "h" thioether no clash examples found. else if (xtype == "e") // Ester iph += ' (example: 1pq8‡). '; // "y" His-Tyr no clash examples found. else if (xtype == "n") // NOS iph += ' (example: 6arh‡). ' + 'See validation examples. '; else iph += ". "; */ iph += 'Click the following ' + xvis + ' possible bonds to inspect for validation: '; iph += '
      ' + xlinx + clinx; // List of bonds + "All" + checkboxes/slab. iph += '
    '; } // END if xlinksCount if (!xLinxCount && xCount) { iph += xIffy + '* ' + '' + xName + ' bonds ' + 'are present in this model, but ALL ARE CURRENTLY HIDDEN. ' + 'Please use the Hide.. or Isolate.. dialogs in the ' + 'Focus Box ' + 'to unhide those that you wish to visualize.
    '; } if (!xCount) // none in the first place. { iph += 'No ' + xIffy + '* ' + '' + xName + ' bonds ' + 'are present in this model.
    '; } if (xLinxCount) { if (!xCount) iph += "
    "; if (xtype == "i") { iph += '1.3-1.5 Å is the range of typical N-Carbonyl isopeptide bond lengths in X-ray models.\n\ However, bond lengths of 1.25\n\ (6KL4)\n\ to 1.56 Å\n\ (1FMA)\n\ occur in 19 models with\n\ resolutions\n\ of 0.9 to 2.9 Å, each containing\n\ bona fide isopeptide bonds.\n' + isopeptideCutoff + ' Å is the detection cutoff.

    '; iph += 'CD = carbon delta (distal sidechain carbon of Glu/Gln).
    '; iph += 'CG = carbon gamma (distal sidechain carbon of Asp/Asn).
    '; iph += 'NZ = nitrogen zeta (sidechain nitrogen of Lys).
    '; } else if (xtype == "t") { iph += '1.6-1.8 Å is the range of typical S-Carbonyl thioester bond lengths in X-ray models.\n\ However, bond lengths up to\n\ 2.15 Å\n\ (3HKU)\n\ occur in 10 models with\n\ resolutions\n\ of 1.3 to 2.9 Å, each containing\n\ bona fide thioester bonds.\n' + thioeeCutoff + ' Å is the detection cutoff.

    '; iph += 'CD = carbon delta (distal sidechain carbon of Gln).
    '; iph += 'SG = sulfur gamma (sidechain sulfur of Cys).
    '; } else if (xtype == "h") // thioether { iph += '1.7-1.9 Å is the range of typical S-C thioether bond lengths in X-ray models.\n\ However, bond lengths up to\n\ 2.05 Å\n\ (3HKU)\n\ occur in 9 X-ray models with\n\ resolutions\n\ of 1.3 to 2.5 Å, each containing\n\ bona fide thioether bonds. In one\n\ cryo-EM structure\n\ (6NEF),\n\ cysteine-heme (HEC) thioether bonds are 1.78 to 1.86 Å to heme.CAB, but\n\ 2.54 to 2.87 Å to heme.CAC. The latter are not reported by FirstGlance because its\n\ detection cutoff is ' + thioeeCutoff + ' Å.

    '; iph += 'CD = carbon delta.
    '; iph += 'CE = carbon epsilon.
    '; iph += 'SG = sulfur gamma (sidechain sulfur of Cys).
    '; } else if (xtype == "e") // Ester { iph += '1.3-1.4 Å is the range of typical O-Carbonyl ester bond lengths in X-ray models.\n\ However, bond lengths up to\n\ 1.59 Å\n\ (2PNL,\n\ 1GDQ)\n\ occur in 9 models with\n\ resolutions\n\ of 0.9 to 2.5 Å, each containing\n\ bona fide ester bonds.\n' + esterCutoff + ' Å is the detection cutoff.

    '; iph += 'OG = oxygen gamma (distal sidechain oxygen of Thr).
    '; iph += 'CD = carbon delta (distal sidechain carbon of Gln).
    '; } else if (xtype == "y") // His Tyr { iph += '1.3-1.5 Å is the range of typical His-Tyr N-C bond lengths in X-ray models.\n\ However, bond lengths up to\n\ 2.06 Å\n\ (1GGE)\n\ occur in 6 models with\n\ resolutions\n\ of 1.3 to 2.9 Å, each containing\n\ bona fide His-Tyr bonds.\n' + histyrCutoff + ' Å is the detection cutoff.

    '; iph += 'NE2 = nitrogen epsilon position 2 (distal sidechain nitrogen of His).
    '; iph += 'CE2 = carbon epsilon position 2 in the ring of Tyr.
    '; } else if (xtype == "n") { iph += '2.67 to 2.94 Å are the N-S distances for the 4 cases reported by\n\ Wensien\n\ et al. (2021) and listed below.\n' + NOSBCutoff + ' Å is the detection cutoff.

    '; iph += 'NZ = nitrogen zeta (sidechain nitrogen of Lys).
    '; iph += 'SG = sulfur gamma (sidechain sulfur of Cys).
    '; } iph +='Other atoms. '; iph += 'Scroll down for Methods.
    '; } // End if xlinxCount // } // End of 'detection method did not fail'. // VALIDATION AND CLASHES if (xtype != "n") { iph += '
    ' + crosslinkValidation; iph += 'Occasionally, a \n\ clash \n\ (atoms closer\n\ than is physically possible) will be reported as a putative ' + xName + ' bond. '; iph += 'Such clashes are sometimes removed when an X-ray model is automatically\n\ re-refined and rebuilt by\n\ PDB-REDO.\n'; // CLASHES in double-dagger footnote. if (xtype == "i") { iph += '

    ‡Clash example: 3ic8.\n\ The atoms at the ends of the sidechains are too close together (see bond lengths above).\n\ Jmol draws spurious "bonds" between them.\n\ The two residues are modeled with two independent sidechains, not as an isopeptide bond.\n\ There is poor electron density for the end of the Lysine sidechain, and the difference\n\ map suggests that the sidechain nitrogen is misplaced.\n'; } else if (xtype == "t") iph += '

    ‡Clash example: 5d12.\n\ Atoms are too close together (see bond lengths above).\n\ Jmol draws spurious "bonds" between them.\n\ The two residues are modeled with two independent sidechains, not as a thioester bond.\n\ The electron density difference map is consistent with the sidechain of the Aspartic acid\n\ being misplaced.'; else if (xtype == "h") // thioether iph += '

    No example of a putative thioether bond actually being a clash is known to us.\n\ If you find one, please send the PDB ID code to ' + make_contact_address("Ester crosslink examples", "."); else if (xtype == "e") // ester { iph += '

    ‡Clash example: 1pq8.\n\ In this extremely high resolution model of trypsin catalysis,\n\ the clash occurs between the sidechain oxygen of Ser195 vs. the main chain N and C-alpha\n\ of Lys403. The occupancies of those 3 atoms are 80%, 0%, and 14% respectively.\n\ (If you click "Show More Details" in the\n\ Molecule Information Tab,\n\ touching an atom reports its occupancy.)\n\ Atoms are too close together (see bond lengths above).\n\ Jmol draws spurious "bonds" between them.\n\ The electron density map underscores the uncertainty in the position of Lys403, which\n\ is in the same space as (clashing with) two alternate locations of Arg3 of chain C (substrate).\n\ The average occupancies for Lys403, Arg3 altloc A, and Arg3 altloc B are 18%, 27%, and 23%\n\ respectively.\n\ '; } // else if (xtype == "y") // His-Tyr Clash: 4rea needs SONOS fix. // NOS Clash is below iph += "
    "; } else // NOSB { iph += '
    *Since Lys-Cys NOS bonds were\n\ \ not widely recognized until 2021,\n\ earlier investigators\n\ may have overlooked them, omitting the O atom.\n\ When FirstGlance suggests such a bond (scroll down for methods), confirmation\n\ of the missing O atom will be crucial, based in part on examination of the electron\n\ density map.
    '; iph += '
    ' + crosslinkValidation + '
    '; iph += '
    ‡Clash example: 6arh.\n\ The sidechains are too close together. Jmol draws spurious "bonds" between them.\n\ There is no room for an oxygen between the N and S. Both sidechains have two\n\ alternate locations with 50% occupancy each.\n\ There is weak electron density for the Lysine rotamer that clashes with Cysteine.\n\ The difference map suggests a rotamer position that would not clash, a blue density\n\ (which, upon checking, is not occupied by a crystal contact).\n\ There are 4 sequence-identical chains, but Lys228 and Cys250 clash only in chain A.\n\ Other "NOS" clash examples are\n\ 7ns5 and\n\ 5r67.\n\
    '; } // End NOSB iph += '
    ' + xName + ' Examples:\n'; if (xtype == "n") iph += '
    See electron density map (EDM) snapshots.'; iph += ''; } iph += ''; iph += 'Thanks to Amr A. Alhossary for some examples above.

    '; iph += 'See Detailed Methods.
    '; iph += '
    When ' + 'alternate locations ' + ' are present, only conformation 1 is queried. '; if (xtype != "n") { iph += 'Possibly not all types of ' + xName + ' bonds will be detected ' + '(see Methods). ' + 'Please report PDB codes for any undetected or incorrect ' + xName + ' bonds to ' + make_contact_address("Problematic " + xName + " bonds in FirstGlance", "."); } else // NOSB { iph += 'Examples involving conformation 2 (alternate location B), not detected by FirstGlance, include\n\ 1nme\n\ and\n\ 1jpu.\n\ In 2021, there were roughly 50 such cases in the PDB. See\n\ von Pappenheim et al., 2021.'; } // If we are already showing crosslinks, additional help: if (xCount && currentView == "renderCrosslink") { iph += "

    " + '† Thick sticks represent the ' + xName + '-bonded residues. Medium sticks represent\n\ "neighboring" atoms (within 4.0 Å). Thin sticks represent more distant\n\ portions of the residues containing neighboring atoms.\n'; } previousCrosslinkType = xtype; return iph; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function showCrosslinkHelpList() { showHelp("makeCrosslinkHelpList()"); } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ // Displays list of all crosslink bond types with counts. function makeCrosslinkHelpList() { if (resfloat > 4.0) { chl = '
    Protein Crosslinks

    \n\ FirstGlance did not scan this model for protein crosslinks because its\n\ resolution\n\ (' + resfloat + ' Å) is too low.\n\ Models with resolutions worse than 4.0 Å are not scanned because\n\ they have too many clashes and inaccuracies in inter-atomic distances.'; return chl; } // TEST: // failIsopeptides = true; grayzero = '0'; ic = (isopeptideCount ? "" + isopeptideCount + "":grayzero); tc = (thioesterCount ? "" + thioesterCount + "":grayzero); hc = (thioetherCount ? "" + thioetherCount + "":grayzero); ec = (esterCount ? "" + esterCount + "":grayzero); yc = (histyrCount ? "" + histyrCount + "":grayzero); nc = (NOSBCount ? "" + NOSBCount + "":grayzero); chl = '
    Protein Crosslinks

    \n\ Choose a type below to list the protein crosslinks present, view and analyze them:\n\ \n'; if (failIsopeptides || failThioesters || failThioethers || failEsters || failHisTyr || failNOSB) chl += '* Detection failed. This is usually due to clashes (atoms impossibly close to each other).
    '; chl += 'Types of crosslinks not listed above are not detected. Fluorophores in green fluorescent\n\ protein and its family members are not detected.\n\ '; return chl; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function showMapHelp() { showHelp("makeMapHelp()"); } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ function makeMapHelp() { dmh = "
    " + cap1only(mapName) + ' Density Map

    '; mtd = expMethod; if (!expMethod.length) mtd = "(unknown)"; if (pdbIsSwissModel) mtd = "homology modeling (Swiss Model server)"; if (pdbIsMakeMultimer) mtd = "symmetry operations (MakeMultimer server)"; if (pdbIsOPM) mtd = "the Orientations of Membranes in Proteins server"; if (pdbIsAlphaFold || pdbIsAFColab) mtd = "AlphaFold"; if (pdbIsRosettafold) mtd = "RoseTTAFold"; var dtb = "determined by"; if (pdbIsSwissModel || pdbIsOPM || pdbIsAlphaFold || pdbIsAFColab || pdbIsRosettafold) dtb = "predicted by"; if (pdbIsMakeMultimer) dtb = "generated by"; if (!hasMap) { dmh += 'No ' + mapName + ' density map is available for this model. Maps are available only for ' + 'models determined by X-ray diffraction or electron microscopy. ' + 'This model was ' + dtb + ' ' + mtd + '.

    '; return dmh; } dmh += 'Use the ' + cap1only(mapName) + ' Density Map links in these locations:' + ''; dmh += 'Examining the ' + mapName + ' density map reveals how well the atomic model ' + 'fits the experimental data. For an explanation, see ' + '' + 'Electron Density Maps.'; return dmh; } /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */ /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */