SPSCAN internal documentation

alphabetic index / program documentation / database / internals / methods

Contents SPSCAN internals

General features of the program

User customizability

Searching for peaks in 3D

Filter to limit changes of ppm in scan-dimensions
Complete List of Integration Parameters
Reduced dimensionality experiments in 3D

Internal formats


qual - description of peak shape
Values with special meaning
Color organization for spectra
NOAH tool internals
wiggles suppression in spectra
Priorities in param_entry and peaks_entry
Display of peaklists, deleting peaks
Assignment tool internals
TOCSY spin system tool

History of SPSCAN

Source code overview

Things that have to be done (development version only)

see also:

SPSCAN Installation

Hardware requirements
Compilation problems
System compatibility

General features of the program

User customizability

spscan does not accept any standard command line options. spscan uses X-Window resources to adapt to user parameters, but it does not do this via the Xt routines, so some features are not standard. The following files are read in, in the given order (increasing priority): The following resources are important:
The library it uses to calculate assignment numbers, resolve pseudoatons, ... (normally /path/to/xeasy.lib)
Spscan.ppm_library: /home/ralf/lib/ecepp.lib
The library to get expected ppm values and standard deviations.
Some of these resources have to point to an existing file, even if the routines that might need the information are never used.
Spscan.path, spm_path, spectra_path, peaks_path
default paths as in xeasy. spm_path is the directory for spscan macros, which should have the extension .spm
If on, spectra in which strips extend over the border of the spectrum are extended on this side by the folded planes. This increases the accuracy of the integration and determination of peak parameters, but may slow down the loading of the spectrum considerably, if RAM size is in the order of the spectral size. (release 30: bugs! some routines crash with "on". Use "on" only if neccessary.)
*traditional_calibration: on / off
Xeasy has been interpreting the "Maximum chemical shift" information in parameter files as ppm of the very edge of the spectrum, i.e. the left side of the left pixel. *traditional_calibration: on supports this mode. "off" interprets the data as ppm in the center of the first pixel, what makes calibration independent of the spectral size in the frequency domain. Don't swith within a project.
Make sure to have the same setting readable for xeasy and spscan, if you use both programs - otherwise peaklists created in the other program are shifted by half a pixel with respect to the spectrum.
Spscan.atom_mapping_library: /home/ralf/spscan/atom_map.lib
A library that defines possible changes of atom names when the fragment type is changed.

Searching for peaks in 3D

General features

First the 2D peaklist is folded. Then a rectangular "interesting area" is determined, within which all peaks and their lineshape areas are. This part of the spectrum is loaded into memory as float (4 byte per pixel).

The "standard" permutation to load the spectrum is to load the "unknown" dimension, i.e. the dimension in which the program will scan for peaks, as dimension 3 (this dimension is also referred to as the "scan" dimension, in contrast to the two "peak" dimensions where the peak positions are known). It may be an advantage to deviate from the default scheme when availabe RAM is smaller than the part of the spectrum that is loaded. I haven't tried things out systematically, and there may be differences in the organization of swap space, but I would recommend to take scan dimension as 1, and the the peak dimension with poor resolution as dimension 3. This should reduce the number of blocks that will be swapped. It may then also help to sort peaks according to ppm in dimension 3. However, in any case computation time increases terribly if the spectrum is much bigger than RAM space.

Filter to limit changes of ppm in scan-dimensions

(3.1.96) description
The original position of the peak is copied from peak_info2::ppm[] to peak_info2::orig_ppm[] with peaklist2::set_orig_ppm() (in search1.cc). After each change of a ppm value in peak-dim a check is performed with peaklist2::pos_allowed(peak_info2 * p, scan_param * scpa). pos_allowed() returns whether or not the new values are acceptable.

The absolute shift is checked for both dimensions independently. Both dimensions are checked, regardless, which has been changed.

The check for the allowed reduction of the distance between two peaks is only performed if peak_info2::status & NOT_ISOLATED. A combination of both dimensions is checked. The position is allowed (return true) if the square of the distance between the current position of peak p and either the original, or the current position of the other peak p2 is bigger than scpa->Min_dist * the original distance between the two peaks. The comparison with the original position is necessay to make things symmetric - otherwise the first move of a peak could totally prevent movement of other peaks.

To calculate the distance, a scaling factor fpp is used that reflects the different linewidth in the peak-dim's. It is calculated from lw[] of this peak.

Complete List of Integration Parameters

Most of the parameters that affect integration and peak picking are in class scan_param. Several classes have scan_param * scpa. They all point to the same place, tt->scpa, so that parameter changes take immediate effect on all functions.

An exception is gauss/lorenz lineshape, which is defined by the static variable n1df::which_shape, which can be changed by the global functions Shape_Gauss(void) and Shape_Lorenz(void). Default is gauss.

To modify the behaviour of the program, click "integration"/"parameters". If you have changed the spectrum or the orientation of the spectrum you can click "defaults" to reset parameters to the default values, or to load a parameter file with the same name as the spectrum, if it exists. "write" saves the current parameters to a file "*.scpa", and "read" loads a parameter file. (see scan_param methods)

!! When you load parameters from a file, they do not adapt to the dimensions of the spectrum. You have to load the spectrum in the right orientation to match the parameters for the individual dimensions.

The parameters have following effects:

linewidth (float scpa->Lw_min[ ], Lw_e[ ], Lw_max[ ])
The linewidth of a peak is limited to the range between Lw_min and Lw_max. If no linewidth is given, Lw_e is used as a starting value. Lw_e is also used as a factor to scale some other parameters.
In scpa->Lw_*[i], i is the dimension of scpa->subspec. To get the dimension of the peaklist use Lw_e[scpa->scan_dim] or Lw_e[scpa->peak_dim[d]].
number of peaks (int scpa->Nr_sc_exp, Nr_sc_max, Nr_sc_min)
expected, maximum, minimum number of peaks in a strip
quality parameters: dont search (float scpa->Ratio_terrible), if min found ((scpa->Ratio_ok), if expected found (scpa->Ratio_good)
Ratio_terrible filters out positions in scan-dimension, which will not be considered as possible peak positions. Ratio_ok and Ratio_good refer to quality parameters of optimized 3D peaks. Peaks must have at least this quality to remain in the chain.
pick mode: (int scpa->Search_pnb)
positive, negative, all, fold +/-, fold -/+
As indicated. "fold +/-" means that peaks which are unfolded in both loaded dimensions (or folded an even number of times) are picked only if positive, while peaks that are folded an uneaven number of times (sum of folds in both dimensions) are only picked if negative. "fold -/+" is the other way round.
There is no possibility currently implemented to fold peaks in scan-dimension according to their volume.
ppm step, lw step (float scpa->Exact_ppm, Exact_lw)
Iterative optimization of peak position and linewith is interrupted, if delta ppm < lw * Exact_ppm or delta lw < lw * Exact_lw. The parameters can be set to zero, as iteration is also interrupted after a certain number of cycles.
float scpa->Doubl_pk_dist
Attempts to split a peak into two (in scan-dimension) are made, if the minimum distance of peak maxima is Lw_e * Doubl_pk_dist
float scpa->Doubl_pk_dist1
If the linewidth is smaller than Lw_e * Doubl_pk_dist1, attempts to split a peak into two are not made at all. Doubl_pk_dist1 cannot be changed in pw, it is set to 1+ Doubl_pk_dist/2
float scpa->Double_flw
not yet documented
float scpa->Lw_exclude
float scpa->Foot_ef
float scpa->Pse_doubl
float scpa->Pse_foot
ratio (float scpa->Big_pnts)
Scales how much the number of points in a scan with an intensity higher than the peak intensity reduces qual. Big_pnts=0 - no reduction whatever, Big_pnts=0.2 - if 20% of the points are bigger, qual becomes zero
float scpa->Small_vol
For peaks smaller than Small_vol, qual is proportional to volume. If the expected peak volume is known, this may be a better mechanism to suppress noise peaks. Small_vol=0 - vol does not influence qual; Small_vol big - qual is proportional to volume (adapt Ratio_ok and Ratio_good accordingly !)
int scpa->Min_sz
Minimum number of points in each dimension, from which an attempt to get a peak shape is made
peak shape: gauss, lorenz
as indicated. This is not a parameter of scpa, but static int n1df::which_shape
peak width / 2 (float scpa->Lwp2)
The area of the spectrum that is considered for a peak shape is Lwp2 * lw on both sides of the peak.
iterations (int scpa->Nr_runs)
The main cycle - searching peaks / substracting / optimizing the position - is run Nr_runs-1 times. Nr_runs=1 means that only peaks are searched once, and no optimization is performed.
Maximum change [in ppm] (float scpa->Max_d_ppm[3], bool scpa->Limit_d_ppm)
The maximum distance in ppm, by which peaks can be shifted in the optimization procedure can be limited.
If the "apply" button is pressed, this feature is activated (scpa->Limit_d_ppm=true). The ppm values of the peaks are limited to the starting value +/- scpa->Max_d_ppm[d]. The starting point is the ppm value before the first iteration. If several integrations/searches are performed without reloading the peaklist, the peak positions can be shifted several times by this amount.
In Max_d_ppm[i] i is the dimension of the peaklist, i=2 is the scan_dimension (In contrast to Lw_e ... ).
Minimum relative distance (float scpa->Min_dist, bool scpa->Limit_dist)
If the "apply" button is pressed (scpa->Limit_dist=true), peaks cannot degenerate. The square of the distance between two overlapping peaks cannot become smaller than scpa->Min_dist times its initial value. The useful range for Min_dist is about 0.3 ... 0.8, default is 0.5

See filter to limit ppm changes in internals documenation.

bool wig_on, float wig_d, wig_f, wig_r
see wiggles suppression
int Excl_hi, Excl_lo
Number of pixels that are marked insignificant at the beginning and end of the scan. to suppress edge noise. can only be set "by hand" in the *.scpa file (below wiggles filter).
For 2 D Integration only the following parameters are used of those described above:

Parameters to evaluate reduced dimensionality experiments

The following parameters are defined in rd_param, and effect the evaluation of reduced dimensionality experiments. They are changed in a separate parameter window, which is called from "integrate"/"parameters" - "red dim p."
float F_dc_freq, F_dc_exmt
The factors between the ppm scales of 4th and 3rd dimension. F_dc_freq is the factor resulting from the frequency of the nuclei involved: it can be set with the "nuclei" menu below. F_dc_exmt is the additional factor introduced in the experiment by application of different time steps in direct and projected dimension (in the lierature usually 1/F_dc_exmt is given).
float Off_dc
Offset for ppm of 4th dimension, i.e. the ppm value corresponding to degenerate symmetric peaks
float Ri_ppm_min, Ri_ppm_max
The range in which peaks in the 4th dimension may be found, in ppm calibration of the projected dimension. This range influences which of the two possible values are written to a peaklist, and it restricts the search range in search1::search_pairs.

Above are the most important parameters to evaluate reduced dimensionality experiments. They have to be checked carefully. The parameters below influence the search for peaks mainly in ambigues situations, they can usually be left at their default values.

bool Oblig_cent
True: A central peak must exist.
False: Two peaks can form a pair if no central peak is in the list (pairs with a central peak always have higher priority).
bool Share_cent
two symmetric peaks for one central possible, i.e. CH2 group
float Center_dev (scpa->Lw_e[scan_dim]/2)
Two pairs are considered to have the same center, if they differ by less than Center_dev ppm. The center of the pair is used, regardless whether there was a central peak and where it was.
bool rdpa->Forc_sy_vol, Forc_sy_lw
force symmetric peaks to equal volume, force symmetric peaks to equal linewidth (default true)
float Fvol_sy_mdev[2], Flw_sy_mdev[2]
maximum allowed factor between volume, or linewidth of symmetric peaks (when peaks that were searched independently are combined into pairs)
Two levels [l] are used: [0] if the expected number of pairs, Npairs_e, has not yet been found and [1] afterwards.
bool Forc_cs_vol
force volume of central peak to a fixed proportion of side peak volume
float Fvol_cs_mdev[2]
maximum allowed factor between volume of sidepeaks and Fvol_cs * volume central peak
float Fvol_cs
expected ratio of volume central/one side peak
float Dev_cs_ppm[2]
maximum deviation of central peak from from center of symmetric peaks, in ppm.
float Wt_ratio_lw, Wt_ratio_vol, Wt_dev_cs
weighting factors to evaluate best correspondence between peaks that might form a pair
int Npairs_min, Npairs_e, Npairs_max
minimum, expected and maximum number of pairs in a scan. A CH2 group counts as two pairs. (actually the current routines do not always give a number of pairs between Npairs_min and Npairs_max)
float Unused_del_vol, Unused_del_qual
Delete peaks which cannot be put into pairs, if vol or qual is lower.
float Next_best_fit ( 1.0 )
If Next_best_fit <= 1.0, the best triple of two symmetric peaks and a central peak is always put into a pair. If Next_best_fit > 1.0, a pair is only formed, if the "fit" value of all possible (and currently not resolved) pairs, that have at least one peak in common with the pair with the lowest fit, is more than Next_best_fit times bigger. In the very last run, or if a fixed peaklist is processed, Next_best_fit should be set to 1.0.
float Fit_good
A pair of peaks must have a match factor < Fit_good to be accepted in the first round of calculation. This parameter (default 10.0) may be reduced to 0.5 ... 2.0 if the list of central peaks is of poor qulaity and should not get too much weight.

Reduced dimensionality experiments in 3D

Nearly all routines that deal with reduces dimensionality spectra are methods of rd_param.

A technique that optimizes peak triplets in one or two separate spectra is not (yet) implemented.

description / parameters

Internal formats

Peaklist formats

External format: see Peaklists

Internally, peaklists can be in two formats: peaklist2 and pal_list. Both can contain 2D as well as 3D lists.

pal_list format is used to read and write peaklists, to combine information from several lists, and in project. Each pal_entry corresponds to one 2D, 3D or 4D peak. The classes and methods are defined in spec.h and peaklist3.cc

Peaklists in peaklist2 format are used for all integration methods (scan_parm::pl) and for evaluation of reduced dimensionality experiments (rd_param::px_pl, c_pl). A list in peaklist2 format has 2-dimensional peak_info2 entries that define the "known" 2D positions or "strips". Each peak_info2 entry can have several peaks of class sc_peak or pairs of peaks (class sc_pair)along the strip. These entries define only the parameters in the 3rd dimension. Consequently, all peaks that belong to one strip have identical ppm, lw and assignment in the 2 base dimensions. The classes and methods connected with this format are defined in peaks.h and peakl.cc
In peaklist2 the format is described by "type", which can be:

peaklist2 format is not directly read and written to file. Transformation between the formats is done with pal_list::add_peaklist(peaklist2 * pl2, int with_pairs, bool ref) and peaklist2::add_peaklist(pal_list * pl3). "type" of peaklist2 and dim of pal_list determine the behaviour of the conversion routines. When peaklist2 format is produced from pal_list (or read from file), peaks that are next in sequence and have identical assignment and position in the strip dimensions are put to the same strip. Peaks that were added in XEASY are usually put into separate strips. To combine them with the other peaks of the strip use "modify pl"/"combine + reference".

Some methods that modify peaklists exist in two versions for the two types of peaklists, and may produce slightly different results.


qual - description of peak shape

sc_peak->qual is a measure for the "quality" of a peak, it is the only variable that is taken to decide whether potential peaks are retained or discarded. It is defined in a different way for 2D and 3D peaks.

3D (12.1.96)
calculated in void scan::optimize(sc_peak * a3p, int add_first). Following steps:

qual is the sum of the squares of deviation between intensity of spectrum and fitted peak. Calculated in void search1::get_volume_2D(peak_info2 * p2, int matrix_ok) When the peaklist is written, the "error" is sqrt(qual)/fabs(vol) * 100, an estimate of the random volume error in percent. This parameter is comparable with the volume error produced by the xeasy integration routine.

Making spscan linewidth data available in xeasy

One strategy to make the linewidth data available in xeasy is to convert the peak list file output by spscan into a format such that xeasy reads the linewidth data into the comment "bin". Then the linewidths fit by spscan can be displayed within xeasy by turning on the comments option in the [pw] command, or by examining the comment slot in the edit peak window with [ed] or [ew].

To make the appropriate change in the peaks file format execute the following commands:

  1. vi t.peaks
    open a vi editor for editing the spscan_output peaks file t.peaks.
  2. within vi type :g/#LW/s//[Ctrl]-V[RET]#/
    note that the letters in brackets refer to hitting the appropriate keys. When the keystrokes are done the return-control character ' ^M ' should appear.
  3. hit return
  4. type :w tt.peaks
    to write the modified peaks file to the new name tt.peaks
  5. quit vi with :q!
  6. just read the file tt.peaks into xeasy and proceed as described in part I.


There is a class gnu_plot defined in statistics.cc, with two derived classes, bar_plot and xy_plot. Data are fed into these classes with "add", and the current statistics are plotted with "set_range()" + "show()". All instances of .._plot are main_t_window::cbp, and old ones are deleted when a new one is created. "set_range_interactive" creates a window to change the plot area. Temporary files .spsc_xyb.gnpd and .spsc_xyb.gnpc are created in the current directory.

Color organization for spectra

8bit PseudoColor Visuals
Colors of intensity spectra are obtained from spectral files in a three-step process:
  1. spectral files are read by the standard read methods, and intensities are translated into float. (A temporary 2D nSpec is created).
  2. the float values are mapped to signed char values with spec_window::col_from_float. With "scale" intensities are scaled by a factor of 2^+/-n, and "shift" determines the base of logarithmic mapping. This mapping is done in spec_window::re_read.The signed char values are stored in cSpec * wspec for redrawing. scale and shift can be changed for each spec_window individually (see spec_window - keys).
  3. Spscan occupies 64 read/write colorcells for spectra drawing, static XColor spec_window::spec_color[0.. 0x3f].pixel. Positive intensities are mapped to 0x20 .. 0x3f, negative 0x1f down to 0.
    The colormap entries are set and changed in void color_popup::paint(). This procedure is called with "spec_color" / "adjust colors". It affects all spectral windows of one instance.
16bit and 24bit TrueColor Visuals
(9.12.99, R1.0.64) A first adaptation to let SPSCAN run on TrueColor Visuals artificially implements a Psedocolor scheme. The procedure changes to the following:
  1. same as above
  2. same as above
  3. The pixel values are taken from static unsigned int color_cellsT[] and used directly for drawing in spec_window::redraw(). They are defined in void color_popup::paint(). The depth of the screen is taken from global screen_depth. Two color coding schemes are supported: 16bit 5/6/5 and 24 or 32bit 8/8/8. The difference with respect to real Pseudocolor is that changes in color_cellsT[] are visible only after a redraw of the respective window. ("r" in the spectral window).

NOAH tool internals

It takes a lot of time to extract the lineshapes from the spectrum. To avoid repetition of the extraction for identical windows a search mechanism has been build into NOAH_tool::decide(void). If a matching NOAH_ls_window is found, NOAH_ls_window::copy(NOAH_ls_window*) copies to_draw from this window, leaving the other window intact. This window can be deleted without interfering with the new window. The classes draw_list, and all draw_obj classes have T * T::copy(void) methods that return the pointer on a new instance that has all further pointers and elements copied.

Wiggles suppression

From Release 1.0.39 on a filter is implemented to supress picking of wiggles in scan-dimension as peaks. The parameters are set and the filter is switched on and off with spm macro commands. By default the filter is switched off. If a spectrum is particulary bad processed, it may be useful to switch one or both of the possibilities on. Dont forget that the state of the filter is written to *.scpa files and used silently whenever you load these parametes.

The wiggles filter in scan::search is set with

spm wiggles_filter 1 <average distance between regular wiggles in ppm> <max. volume ratio> 
<suppression range in ppm> 1 <max. volume ratio> <suppression range in ppm> 
and switched off with
spm wiggles_filter 0 x x x 0
You can estimate <max. volume ratio> and <suppression range in ppm> from a few slices through very big and sharp peaks. <average distance between regular wiggles in ppm> you can also determine directly from the spectrum / slice, or you may use statistics as described below.

The parameters bool wig_on, float wig_d=<average distance between wiggles in ppm>, float wig_f=<max. volume ratio> and float wig_r=<suppression range in ppm>" as well as wig_on2, wig_f2 and wig_r2 for irregular peaks are members of scan_param. They are written to and read from the *.scpa file, but they are not displayed in the parameter window.

The filter treats maxima as regular wiggles, which are surrounded by maxima in a distance = <average distance between wiggles in ppm> and have a big peak in their neigbourhood, where the volume ratio is smaller than (<suppression range>-distance)/<suppression range>*<max. volume ratio>.

The second set of parameters (wig_on2, wig_f2, wig_r2) simply supresses all peaks with a volume smaller than a triangle with the base +/- wig_r2 around big peaks, and a height wig_f2 * the volume of the big peak.

With the macro command "spm wiggles_statistics min_big d_ppm n_bars" it is possible to estimate the average distance between regular wiggles in scan-dimension. Pick the spectrum without small volume suppression and with low quality border so that you get lots of wiggles picked as peaks. Call "spm wiggles_statistics 1e6 3.0 50" to see the distribution of other peaks in the area +/- 3 ppm around peaks with vol > 1e6, with a precision of 2*3/50 ppm (use statistics - set range to get more precise results). Estimate the distance between two maxima.

Values with special meaning

"-1" is invalid for fragment numbers, assignment numbers, ... Sequence number "0" is invalid in some assignment manager routines.
999.0 ppm is invalid in xeasy-lists.
Residue ALL matches any residue.

Priorities in param_entry and peaks_entry

priorities are used to get chemical shifts of resonances from those peaklists, and that dimension in a peaklist, where the most accurate value would be expected. When ppm values are set in a proton list, only peaklist entries with the highest priority available are averaged. The priority of the individual dimensions of a peaklist are in peaks_entry::c_priority[d]. By default, c_priority[d] is the sum of peaks_entry::priority and param_entry::priority[perm_sp[d]], the priority of the matching dimension in the spectrum.

Display of peaklists, deleting peaks

Peaklists cannot be displayed by spec_window itself - it displays only the draw_peak objects in to_draw. Requests for peaklist display and peak manipulation are handled by its spec_display * sd, if it has one.

Procedure when peaks are deleted: draw_peak::kill_notify - lswin.cc pl->remove(origin); // deletes peak from peaklist sdcp->notify(Kill, pl, origin); // notify users of pl (in spec_display.h, for all spec_display* in sdcp) spec_display::kill_notify - spec_win.cc update_peaks(pl); sw->redraw();

Assignment tool internals

Resonances and priority of peaklists: ass_tool::
When the tool is constructed, the current resonance list of the project is used as a starting point (take care that it is up to date). All peaklists of the project that are connected with the spectrum that is displayed will be used to update the resonance list with a priority of 5, the currently displayed peaklist (if there is a peaklist displayed upon construction of the tool) will get a priority of 10.
see resonance_list::fill
Changes of peak and resonance position
All changes in the peaklist are global, i.e. they effect all windows that use this peaklist. Whenever the peaklist is saved, e.g. "with project - edit - dump current state" the changes are written to file.
All changes to the resonance list are local to the assingnment tool. These changes are lost when the tool is closed or the resonance list is reset.
The reason is the use of resonance_list rl in ass_tool. It is derived from pj->am->d_prot, but it does not store data back to d_prot.

TOCSY spin system tool

TOCSY spin system tool 'tsst' is a tool to speed up interactive assignment of amino acid spin systems with 2D 1H-1H TOCSY and COSY spectra. All code is in spin_tool.cc. It can only be controlled with macro commands (command_handler::tsst_command), and it works only on the basis of a project.

Invocation over the menu calls the following standard macro to build the tool:

This assumes that the project contains spectra with id "TOCSY" and COSY. A peaklist tsst.peaks is loaded, or initialized if it does not exist.


Spscan is not a replacement for xeasy. Many functions have not been implemented in spscan just because they are available in xeasy and so it would not be worth the effort to implement them here. Spscan was written in a way that makes the exchange of data with dyana and xeasy as simple as possible. However, spscan and xeasy have completely different philosophies how to organize assignments when residues are mapped. You must not mix these two philosophies !

Consequently, you have two ways to work on your molecule:

  1. Work mainly in xeasy and use spscan to pick 3D peaks and integrate them, set initial default assignments, extract ECOSY coupling constants ... Then you assign all your peaklists for spscan in "mode 5" with *.seq and *.prot list, and you schould never create a "project" in spscan.
  2. Use the "project" functions of spscan. Put all spectra and peaklists that contain important information into the project. Do all mapping in spscan. Never try to map a residue in xeasy, never assign a peak to a proton that does not exist in the proton list. Use xeasy only to display and plot the results, for interactive peak-picking etc. - or don't use it altogether.
Any intermediate approach will end in chaos if you dont know exactly what you are doing.

History of SPSCAN

During an EMBO short term fellowship in the Laboratory of Molecular Biology of the MRC, Cambridge, with Lutz Riechmann I developed some computer routines to support sequential assignment with incomplete data sets.
The idea of a new NME evaluation program took shape. The program should be able to combine the information from several peaklists, but "go back" to the full information contained in the spectra to resolve ambiguous situations. The first routines were programmed for a small Linux laptop.
Oct. 1995 - March 1997
Full-time program development under grant Gl 237/1-1 of the Deutsche Forschungsgemeinschaft in the laboratory of Professor Kurt Wüthrich at ETH Zürich.
Jan. 1996
First release tested in the Wüthrich group. 3D Integration and peak search are functional.
July 1996
Release 1.0.33. Support of projected (reduced-dimensionality) spectra started. Development of several tools, e.g. ECOSY evaluation. Program tested in other laboratories.
July 1996 - March 1997
Numerous tools and features were added to the program. Development of a database that organizes the spectra and peaklists of a NMR project.
March 1997
Release 1.0.53 was made available as a test release outside the Wüthrich group.The basic functions of the program (Peak picking and integration, evaluation of 4D->3D reduced dimensional spectra, ECOSY tool) have been extensively tested. Some of the routines (to find sequential connectivities, organization of the database) are still under development or in the test stage.
July 1998
Release 1.0.62 as a new "official" release. The most important changes compared with 1.0.53:
  • many bugfixes in the recently developed functions
  • major rearrangements in the source code to produce a more uniform behaviour. Some of the macro commands have changed.
  • Reto Koradi's code for contour plots implemented.
  • Display of spectra and peaklists outside the pre-defined tools.
Oct. 1997 - 1999
In addition to my job in the NMR group of Anne Ulrich in Jena, I continued maintanance and development of SPSCAN in the weekends. I wrote a short manuscript for J. Biomol. NMR to describe the program and make it known and available to a wider public. It was planned to make the source code available upon publication of the program. However, the manuscript was rejected, so I stopped working on the program - except some functions that I needed myself. (This manuscript is nevertheles a good starting point to become familiar with the program)
2000 - 2002:
After the publication failed, I was planning to publish the features of the program in connection with a protein structure solved with the help of this program. Unfortunately, I never got a suitable project, and meanwhile I had to shift my activities completely to solid-state NMR. I could not do anything with respect to the program, despite various plans to continue SPSCAN development. So I decided to put the program under the GNU GPL to keep it alife. I hope that people who find the program useful will spend some time and improve it further.
April 2002:
SPSCAN 1.1.0 released under the GNU General Public Licence:
  • based on 1.0.65
  • code removed or replaced that I had no right to put under GPL

Current status:
Linux (2.0, gcc, fvwm2) was recently used for development. Older versions were mainly tested on SGI or SUN.

PLEASE SEND ME BUG REPORTS or better: BUG FIXES !! The functions were thoroughly tested when they were developed, but the program has undergone many changes since then, also compiler and X11 features change.

There is still a number of routines that were never completed and used.

Details of changes between recent versions.

Further Development

I hope that people will find SPSCAN a useful program, use it, add further tools, fix bugs and share their work with other people by making additions and fixes availble to everyone. (i.e. send it to me)

The basic design of SPSCAN is now about 8 years old. Some features like the GRAFIX X-interface were the best choice at that time, but today they make problems and should better be replaced. Some routines could be programmed much more elegantly without the speed and memory limitations of 1995. Nevertheless I think that the routines available in SPSCAN are a good base for NMR spectra evaluation, and that SPSCAN is a suitable framework to test and implement innovative evaluation concepts.

I will always be glad to share the experience I got writing this program and discuss similar projects.

alphabetic index / program documentation / database / internals / methods
Dr. Ralf W. Glaser
FSU Jena, Institut fuer Molekularbiologie
Winzerlaer Strasse 10
D-07745 Jena, Germany
Tel.: +49-3641-65-7573
Fax: +49-3641-65-7520
E-mail: Ralf.Glaser@uni-jena.REMOVSPMTAG.de

Last modified: Thu Jun 30 23:02:07 CEST 2005