You are here: Home V2 Software Software More ... Developer Notes Data Model Subpeak Handling

Subpeak Handling

Model change to handle projection experiments, subpeaks, etc. IMPLEMENTED Rasmus Fogh 2007

Our current model has assignable splittings. This is nice, because you can assign peak features directly to NMR parameters. Unfortunately it fails whenever you have only one component of a splitting, which means in TROESY, projection experiments, J coupling measurements, ...

This is the first draft of an alternative:




Changes from previous model

  • Classes SubPeak, SubPeakDim, PeakSplitting, AbstractPeakSplitContrib, PeakSplitContrib, and PeakSplitContribN disappear.
  • Peak is merged with AbstractPeak, PeakDim is merged with AbstractPeakDim
  • ExpDimRef.isSplitting disappears
  • ExpDimRef.validFactors, ExpDimRef.minNum and ExpDimRef.maxNum are added
  • The PeakDimComponent class is added.

How it should work

There is only one kind of peak, used for both peak centres and multiplet components. Peaks can be groups by linking components to the centre using the centrePeak/subPeaks link.

In the normal case, where you have only peak centres and do not assign splittings, things work just as before. When you have no PeakDimComponents you simply use the PeakDim.dataDimRef and PeakDim.peakDimContribs links, and the PeakDim.getValue and .setValue functions will work.

When you do have PeakDimComponents all assignment must go through the PeakDimComponent. Also the PeakDim.dataDimRef link can not be populated if there are PeakDimComponents (and vice versa), and the PeakDim.getValue and .setValue functions will not work (and will return None).

You have a PeakDimComponent for every NMR paramter that contributes to the position of the peak. TROSY, e.g. would have one for the shift and one for the J coupling. The actual position would be a sum of two values (in points), where one would convert to a shift and the other would convert to a coupling. Of course there is not enough information to extract the value of either. You would get a linear equation, which could be combined with other equations from elsewhere to calculate actual values. The same would hold for GFT or reduced-dimensionality spectra, coupling multiplets, etc. A reduced-dimensionality experiment like 'H[N[CO[CA]]].CO splitting CA' woudl hav two peaks per NH. both would have a PeakDimComponent pointing to the CA DataDimRef with factor +1, and a PeakDimComponent pointing to the CO DataDimRef with factor either +1 or -1.

The PeakDimComponent.factor would multiply the point (or point difference) value before further calculation. If you have a doublet, one component would have factor +1 and the other -1. For J doublets it does not matter (if you can ignore the sign of the coupling), but for projections or complex J multiplets it is necessary.

The scaling information to get you from point to value and vice versa is kept in DataDimRef.valuePerPoint. We would need to decide how to handle splittings, since it is the splitting that corresponds to e.g. the J coupling, whereas we would more naturally work in the distance from the centre, i.e. half the splitting.

The new attributes in ExpDimRef would give the valid values for PeakDimComponent.factor , and the maximum and minimum number of PeakDimComponents that could be made for a given DataDimRef - if we have e.g. active proton coupling we do not know in advance how many couplings we are going to get. If we have several ExpDimRefs with minOccur < 0, it would make sense to create the necessary PeakDimComponents automatically whenever you create the PeakDim.

Open Questions

One problem would be to distinguish between peaks with all necessary PeakDimComponents and those where some PeakDimComponents were not yet set. If we create the required components automatically, we could simply treat teh curernt set as if it was corerct and leave teh rest to teh user.

There is also the question of how to handle alternatives - we might get a situation where we had either proton coupled carbon or carbon-coupled nitrogen on peaks in a given dimension.

There is a mechanism for grouping peaks, but no constraints or semantics for the relations between the grouped peaks.

The names might need rethinking.

Pros and cons

The normal case is handled the same as always.
We have fewer classes in the model
We can handle any combination of splittings
The simple and complex cases are handled in two different ways.
We will need some complex constraints on the links