Hi,
In response to Brian's email from Wednesday:
> 1. I'm reading a 3D ANSIG xpk file, but the first crosspeaks in it are
> from a 2D HSQC. formatConverter wants to treat this as a 3D although it
> seems to be OK at working out which 2Ds and 3Ds later in the xpk file. I
> guess this is because there are some chemical shift values in the 3rd dim
> of the hsqc peaks in the file. This can happen because ANSIG does not
> bother to zero shifts for dimensions it doesn't care about for a
> particular xpk/spectrum combination, and it reuses slots in the peak
> database when crosspeaks are deleted. So I can "show all expTypes" and
> set the correct (2D) one, but I am still offered 3 dims to assign
> nuclei/shift ranges to and have no mechanism to tell the program to ignore
> the irrelevant dimension.
The code will try to use what is there (since there are 3 columns with
values it cannot decide what is what). So were you 'stuck' in the peak
dimension mapping window at this stage?
> 2. Opening a help window seem to lock up the rest of the GUI - it would be
> nice to be able to have a help window up and then follow the instructions
> it contains!
I agree! The problem is that (in contrast to a GUI-driven program like
Analysis) the FormatConverter has to work in a sequential way, resolving
ambiguities step by step. This means that popups are usually 'modal', and
basically lock up all the other windows and, more importantly, stop the
Python script in its tracks until the user interaction is resolved. We're
looking at a way to resolve this... .
> 3. Uninteruptableness: If you find yourself doing something that you don't
> really want to with formatConverter it seems to be hard to kill (basically
> you have to kill the parent python process with a "kill" command). It
> would be nice to be able to interrupt things, or at least kill the program
> with a Ctrl-C/D.
Yes. This is also related to the 'modal' window problem described
above. Once we get that sorted, I will also see if I can postpone the
creation of any objects in the Data Model until a specific function (e.g.
readPeaks()) is finished, so one doesn't end up with a half-finished
import.
Note that this will not work for linkResonances: that bit of code is too
complex, and I need all the objects from the Data Model as they are
created. So in this case it is wise to save the project before running
linkResonances. If all goes well, then resave the project.
> 4. Handling -ve sequence numbers. I had the cloning artefacts in my
> sequence numbered with -ve numbers followed by the authentic sequence
> numbered from 1. So I had -1,1 with no 0 between (since 0 doesn't mean
> anything in this context and ANSIG doesn't handle it gracefully).
> Unfortunately it looks as if formatConverter (and the data model) counts
> through 0 in this case.
Currently the sequence numbering *has* to be sequential or you will run
into problems. I will look into writing extra code that allows one to
'map' sequential fragments and also handle non-number sequence codes such
as 'A0' or '1B'.
> 5. Given that formatConverter doesn't give a python prompt, I don't see
> ways to run integrity checks or do anything not coded in the menus as with
> analysis.
The format converter is really only a GUI layer on top of a set of Python
scripts that do all the work. You can view this as a kind of 'higher level
format conversion API' on top of the Data Model API. An example of such a
script is given at the end of this mail.
Using the Python layer directly allows a much higher level of control and
automation when doing import/export. A lot of the features accessible
directly via the Python scripts are currently not available from the GUI,
but I will work on fixing that next week.
Hope that all makes sense,
Wim.
--------------EXAMPLE SCRIPT OF CONVERSION OF NMRVIEW TO XEASY-----------
#
# Get the top level data model package
#
import memops.api.Implementation as Implementation
#
# Get the format converter classes for NmrView and XEasy
#
from ccpnmr.format.converters.NmrViewFormat import NmrViewFormat
from ccpnmr.format.converters.XEasyFormat import XEasyFormat
#
# Read in a function to help create an NMR experiment and datasource
#
from ccpnmr.format.general.Util import createExperiment
from ccpnmr.format.general.Util import createPpmFreqDataSource
#
# Get Tkinter for popups
#
import Tkinter
if __name__ == "__main__":
#
# Create main Tk window for popups
#
gui = Tkinter.Tk()
#
# Create a project
#
ccpnProject = Implementation.Project(name = 'conversion')
#
# Create an NmrView class and read in the files... create an experiment
# for the peak list beforehand and pass in the parameters.
#
nmrViewFormat = NmrViewFormat(ccpnProject,gui)
nmrViewFormat.readSequence('testSequence.seq', minimalPrompts = 1)
nmrViewFormat.readShifts('testPpmOut.out', minimalPrompts = 1)
nmrExp = createExperiment(ccpnProject,'test_experiment','noesy_hsqc_HNH.hhn')
nmrDataSource = createPpmFreqDataSource(nmrExp,'test','processed',nmrExp.numDim)
nmrViewFormat.readPeaks('testXpk.xpk', dataSource = nmrDataSource, minimalPrompts = 1)
#
# Run linkresonances....
#
nmrViewFormat.linkResonances(setSingleProchiral = 0,
setSinglePossEquiv = 0,
minimalPrompts = 1)
#
# Note that at this stage everything is inside the data model, and code that
# works with the Data Model can be run at this stage (e.g. creating a chemical
# shift list from a set of peak assignments, ...).
#
#
# Export XEasy files... the right CCPN object(s) has to be selected first.
#
xeasyFormat = XEasyFormat(ccpnProject,gui)
chains = list(ccpnProject.molSystems[0].chains)
xeasyFormat.writeSequence('autoXEasy.seq',chains,minimalPrompts = 1)
shiftList = ccpnProject.findFirstNmrMeasurementList(className = 'ShiftList')
xeasyFormat.writeShifts('autoXEasy.prot',shiftList,minimalPrompts = 1)
peakLists = list(nmrDataSource.peakLists)
xeasyFormat.writePeaks('autoXEasy.xpk',peakLists,minimalPrompts = 1)
|