i like this post (click again to cancel)
i dont like this post (click again to cancel) remove favorite mark from this question (click again to restore mark)

Is it possible to generate a spectrum from BMRB chemical shifts?

I want to generate a spectrum to use as a reference for an H1-N15 HSQC experiment.

asked Nov 03 '11 at 10:46

Andreas's gravatar image


4 Answers:
i like this answer (click again to cancel)
i dont like this answer (click again to cancel)

NMRPipe already has some facilities for generating qualitative simulations, and you can start with BMRB-format data. Here's how ...

The script "star2cs.tcl" converts BMRB format chemical shifts into the chemical shift tables used by NMRPipe-related programs like TALOS.

The script "c2pk.tcl" takes a chemical shift table, and creates a simple synthetic 2D or 3D peak table for a selected canonical spectral type, like HN, HNCA, CBCANH, etc. Linewidths are uniform, and intensities are one of two values, depending on whether the signals is intra- or inter-residue.

"cs2pk.tcl" also creates a script which uses the synthetic peak table to generate a synthetic FID in NMRPipe format.

If you give "cs2pk.tcl" the "fid.com" conversion script for a measured spectrum, it can set up the simulated data so that it has the same parameters as the measured data. Otherwise, it will use some generic spectral widths etc for 1H, 15N and 13C.

This creates "csObs.tab":

   star2cs.tcl -in ubiq_bmr6457_1D3Z.str -out csObs.tab

This creates "simTD.tab" and "simTD.com" for a 2D HN/N spectrum:

  cs2pk.tcl -in csObs.tab -type HN

This is what simTD.com as created above looks like:


simTimeND -ndim 2 -in simTD.tab -rms 1.0 -nots \
 -xT           512 -yT           128 \
 -xN          1024 -yN           256 \
 -xMODE    Complex -yMODE    Complex \
 -xSW       9000.0 -ySW       2000.0 \
 -xOBS       600.0 -yOBS        61.0 \
 -xCAR       4.745 -yCAR       118.0 \
 -xLAB          HN -yLAB           N \
 -xP0          0.0 -yP0          0.0 \
 -xP1          0.0 -yP1          0.0 \
 -aq2D States -out sim.fid -verb -ov

answered Dec 11 '11 at 14:15

delaglio's gravatar image


i like this answer (click again to cancel)
i dont like this answer (click again to cancel)

To simulate a 2D 1H-15N HSQC spectrum you will need information regarding chemical shifts of 1H and attached 15N nuclei, 1H-15N coupling constants and relaxation rates/line-widths.

You can generate a model 1H-15N HSQC spectrum from BMRB chemical shifts, if the chemical shifts of ALL the 15N nuclei in the protein and the attached protons have been assigned for the molecular (protein?) of interest. If information, regarding relaxation rates is also available for the same protein in BMRB then you can calculate the linewidths. You may find that for many BMRB data sets the 15N relaxation rates are available, but the corresponding relaxation rates for 1H are not available. The 1J(1H-15N) coupling constant is fairly uniform for most backbone amides, and the literature value should be fine for most applications.

If information regarding relaxation rates is not available in BMRB for the protein of interest and if you have a globular protein, and if its molecular weight is known, then you can predict T2's for backbone amides. As an initial approximation, you may neglect the effects of chemical exchange. For proteins, the molecular weight of the monomer can be easily calculated from knowledge of the amino-acid sequence (this information should be present in the BMRB data files) - the number of monomers in a molecule of the protein has to be determined experimentally.

A number of spectral simulation programs capable of generating 1H-15N HSQC spectra from chemical shifts, coupling constants and relaxation rates are available, e.g., GAMMA from ETH group.


answered Dec 03 '11 at 11:34

sekhar%20Talluri's gravatar image

sekhar Talluri

updated Dec 03 '11 at 11:43

i like this answer (click again to cancel)
i dont like this answer (click again to cancel)

assuming that you just care about the correct peak positions, have a look at the program peaks2ucsf :

you have to make an input peak list first, see below

$ peaks2ucsf Syntax: peaks2ucsf output-file < parameter-file

Creates a UCSF format spectrum file from a list of Gaussian peaks. The parameter file has the following format.

2 # dimension 1024 2048 # matrix size 8.37 9.21 # ppm at index 0,0 H H # nuclei (H, N or C) 500.123 500.123 # nucleus frequencies (MHz) 4000.732 5200.183 # spectral widths (Hz) 4.37 2.15 1.95e6 13.2 15.1 # Gaussian center (ppm), height, linewidth (Hz) .


answered Dec 07 '11 at 02:35

eiso's gravatar image


i like this answer (click again to cancel)
i dont like this answer (click again to cancel)

Here's a procedure I came up with to get a 2D spectrum in NMRPipe format from an NMRStar chemical shift file downloaded from BMRB. It's a bit tedious, but it does work. Except for the Perl script I'll put at the end, everything is in a stock NMRPipe install.

Here are my instructions to myself:

1) Prepare a shift list in NMRPipe table format. You can use my star2pipe.pl script for this, modified as necessary. The list MUST contain these columns:


Values for XAXIS, YAXIS, XW, and YW can all be set to 0.0 for now. XWHZ and YWHZ should be reasonable values (I've found that 20 Hz works well). Call this file temp.tab.

2) Prepare an empty NMRPipe spectrum. Make sure the spectral frequencies and sweep widths are reasonable. Also, the axes should be in the same order as in the peak table. Call this file temp.ft2. Two ways to do this:

2a. Make a copy of an existing HSQC with the data zeroed.

nmrPipe -in myhsqc.ft2 -out temp.ft2 -fn SET -r 0.0 -ov -verb

2b. Create an empty fid and transform it:

simTimeND -xN 2048 -yN 512 \
-xT 1024 -yT 256 -xMode Complex -yMode Complex \
-xSW 6000.0 -ySW 2000.0 -xOBS 500.0 -yOBS 50.0 \
-xCAR 4.773 -yCAR 118.0 -xLAB 1H -yLAB 15N \
-ndim 2 -aq2D States -out temp.fid -verb -ov

nmrPipe -in temp.fid \
| nmrPipe -fn FT -di \
| nmrPipe -fn TP \
| nmrPipe -fn FT -di \
| nmrPipe -fn TP -out temp.ft2 -ov

3) Update your table file to have the correct values IN POINTS for the peak positions and linewidths:

updateTab.tcl -in temp.tab -data temp.ft2 -pts -out temp_updated.tab

4) Create the synthetic spectrum using the files you've made using one of these methods:

4a. Frequency domain spectrum:

simSpecND -in temp_updated.tab -data temp.ft2 -mod GAUSS1D GAUSS1D -verb

4b. Time domain (FID) data:

simTimeND -in temp_updated.tab -xN 1024 -yN 256 \
-xT 512 -yT 128 -xMode Complex -yMode Complex \
-xSW 6000.0 -ySW 2000.0 -xOBS 500.0 -yOBS 50.0 \
-xCAR 4.773 -yCAR 118.0 -xLAB 1H -yLAB 15N \
-ndim 2 -aq2D States -out temp.fid -verb -ov

Note that in 4b. the point sizes in both dimensions are HALVED relative to the command in step 2b. If not, the peaks are in the wrong places! This probably has to do with processing the data to get the right point sizes and deleting imaginaries.

And here is my star2pipe.pl script. You'll need to modify the output in the last few lines to have all the columns/fields listed in step 1 above.


# script to make an NMRPipe format 15N HSQC table file with four columns
# from an NMRSTAR file. The input file should only have the lines with
# chemical shift assignments.

# added residue offset for renumbering output file - NMRStar appears to
# always start numbering at 1.
# updated column numbers for NMRStar3 files with "real" and sequential
# residue numbering
# updated to check for same residue number as well as both H and N

# usage: star2pipe.pl {NMRSTAR file} {residue offset}> {NMRPipe file}

open(IN, $ARGV[0]) || die;
$offset = $ARGV[1];

$index = 0;
$n = 0; $h = 0;

while (<IN>) {
        @x = split(' ',$_);
        $res = lc($x[3]);
        $res = ucfirst($res);
        if ($x[4] eq "N") {
                $Nppm[$index] = $x[6];
                $resnumn = $x[1];
        if (($x[4] eq "H") || ($x[4] eq "HN") || ($x[4] eq "H1")) {
                $Hppm[$index] = $x[6];
                $resnumh = $x[1];
                $ass[$index] = ($x[1]+$offset).$res;
        if ($h && $n && ($resnumh == $resnumn)) {
                $h = 0; $n = 0;

close IN;

print "FORMAT %4d %s %4.2f %4.2f\n\n";

for ($i = 0; $i < $index; $i++) {
        printf "%4d\t%s\t%4.2f\t%4.2f\n", $i+1, $ass[$i], $Nppm[$i], $Hppm[$i];

answered Dec 08 '11 at 14:26

Andrew%20Fowler's gravatar image

Andrew Fowler

updated Dec 08 '11 at 14:32

Your answer
Please start posting your answer anonymously - your answer will be saved within the current session and published after you log in or create a new account. Please try to give a good answer, for discussions, please use comments and please do remember to vote (login to vote)
toggle preview

powered by CNPROG