JiscMail Logo
Email discussion lists for the UK Education and Research communities

Help for CCPNMR Archives


CCPNMR Archives

CCPNMR Archives


CCPNMR@JISCMAIL.AC.UK


View:

Message:

[

First

|

Previous

|

Next

|

Last

]

By Topic:

[

First

|

Previous

|

Next

|

Last

]

By Author:

[

First

|

Previous

|

Next

|

Last

]

Font:

Proportional Font

LISTSERV Archives

LISTSERV Archives

CCPNMR Home

CCPNMR Home

CCPNMR  June 2005

CCPNMR June 2005

Options

Subscribe or Unsubscribe

Subscribe or Unsubscribe

Log In

Log In

Get Password

Get Password

Subject:

Re: A few not so critical bugs...

From:

Wayne Boucher <[log in to unmask]>

Reply-To:

CcpNmr software mailing list <[log in to unmask]>

Date:

Thu, 30 Jun 2005 14:30:31 +0100

Content-Type:

MULTIPART/MIXED

Parts/Attachments:

Parts/Attachments

TEXT/PLAIN (130 lines) , WindowPopup.py (1 lines)

Hello,

The change to make the orthogonal scrollbar do what it should do is a bit
more complicated than the fixes below, so I've attached an updated
WindowPopup (which hopefully makes everything better and nothing worse,
although sod's law will tell you that something will probably get worse).

Wayne

On Thu, 30 Jun 2005, Tim Stevens wrote:

> > Adding a new strip makes the new strip active, but using "navigate
> > to" from another window sets the postition in both the new strip and
> > the last active strip. This is also true for other commands that
> > should go to just the active strip, like changing z-position using
> > the slider.
>
> Fixed for next release. Otherwise, in
> $CCPN_HOME/python/ccpnmr/analysis/WindowPopup.py at about line 3540 just
> after:
>
>     if len(self.window.axisPanels[0].axisRegions) > 1:
>       self.stripsButtons.buttons[1].enable()
>
> Add the lines:
>
>     if col == -1:
>       self.activateStrip(len(self.window.axisPanels[0].axisRegions)-1)
>     else:
>       self.activateStrip(col)
>
>
> > Using the "Find peak" button in the "Peak selection" Panel always
> > finds the peak in the first strip and not in the currently active.
>
> Ah. This function has pre-strip era code. Wayne is updating it now.
>
>
> > The "Remove" strip button in the spectrum window does not remove the
> > active strip, but the last strip.
>
> Fixed. Again in $CCPN_HOME/python/ccpnmr/analysis/WindowPopup.py in the
> function deleteCol(), just after:
>
>     N = len(self.window.axisPanels[0].axisRegions)
>     if N > 1:
>       active_col = self.getActiveStrip()
>
> Add the lines:
>
>       if (col == -1) and (active_col != 'all'):
>         col = active_col
>
>
> > If the an active strip is removed, the new active strip gets the z-
> > position of the removed strip. (But the shown position is not altered
> > until the "slider" is moved.)
>
> Wayne is working on this one.
>
>
> > I also have a "wish list":
> >
> > It would be great if the assignment panel had an option to show only
> > possible assignments for which the sequence number is the same in two
> > or more dimensions. This would for example help if a 3D 15N-NOESY
> > spectrum is to be assigned, given a known HN and N assignment. Since
> > these resonances always come in pairs it would be great to be able to
> > remove all assignemt suggestions in which the HN and N belongs to
> > different residues in one of the H dimensions and in the N-dimension.
>
> This is already present in the latest versions of the Edit Assignment
> panel. There are two options for this sort of thing:
>
>   1, Restrict to repeated spin systems []
>
>   2, Bound resonances []
>
> These will limit the resonance possibilities for peak dimensions where a
> resonance is in the same spin system as (1) or bound to (2) a resonance in
> another dimension. Option (1) is useful if the resonances are in (possibly
> unassigned) spin systems. Option (2) is useful if the resonances carry
> atomic assignments.
>
> In the future, with the imminent inclusion of ExperimentPrototypes, there
> will be a further/replacement option to limit the resonances to only those
> that are allowed according to the types and connectivities possible for
> the peak's experiment.
>
>
> > I would like a feature in which a known assignment and structure
> > could be used to assign a NOESY-spectrum. Ansig for Windows has a
> > feature in which all distances up to a given distance can be plotted
> > in the NOESY spectrum as circles (larger circle = shorter distance)
> > with the assignments. This makes it easy to make and verify
> > assignemts in the spectrum.
>
> A structure 'predicted' NOESY is a good idea. Wayne and I will discuss how
> we might include this.
>
> At the moment you can load in a structure and display the distances from
> an assigned NOESY dimension to other possibilities in the Edit Assignment
> panel. Also, these possibilities can be superimposed on the structure with
> the [Show On Structure] function. Although, this is limited because you
> have to have one end on the NOE tied down, it should help until we have a
> better system.
>
>
> > Something which probably is alread on your "to do" list is to read
> > structures and compare them to constraint lists, make statistics and
> > then produce a peak list with all violations. It would be very useful
> > in stucture determinatinos!
>
> This wasn't on my "to do" list, but it is now. :)
>
> Tim
>
> -------------------------------------------------------------------------------
>  Dr Tim Stevens			Email: [log in to unmask]
>  Department of Biochemistry            [log in to unmask]
>  University of Cambridge        Phone: +44 1223 766022 (office)
>  80 Tennis Court Road	               +44 7816 338275 (mobile)
>  Old Addenbrooke's Site 	       +44 1223 364613 (home)
>  Cambridge  CB2 1GA	   	WWWeb: http://www.bio.cam.ac.uk/~tjs23
>  United Kingdom 		       http://www.pantonia.co.uk
> -------------------------------------------------------------------------------
> ------ +NH3CH(CH(CH3)OH)C(O)NHCH(CH(CH3)CH2CH3)C(O)NHCH(CH2CH2SCH3)CO2- -------
> -------------------------------------------------------------------------------
>


""" ======================COPYRIGHT/LICENSE START========================== WindowPopup.py: Part of the CcpNmr Analysis program Copyright (C) 2005 Wayne Boucher and Tim Stevens (University of Cambridge) ======================================================================= This file contains reserved and/or proprietary information belonging to the author and/or organisation holding the copyright. It may not be used, distributed, modified, transmitted, stored, or in any way accessed, except by members or employees of the CCPN, and by these people only until 31 December 2005 and in accordance with the guidelines of the CCPN. A copy of this license can be found in ../../../license/CCPN.license. ======================COPYRIGHT/LICENSE END============================ for further information, please contact : - CCPN website (http://www.ccpn.ac.uk/) - email: [log in to unmask] - contact the authors: [log in to unmask], [log in to unmask] ======================================================================= If you are using this software for academic purposes, we suggest quoting the following references: ===========================REFERENCE START============================= R. Fogh, J. Ionides, E. Ulrich, W. Boucher, W. Vranken, J.P. Linge, M. Habeck, W. Rieping, T.N. Bhat, J. Westbrook, K. Henrick, G. Gilliland, H. Berman, J. Thornton, M. Nilges, J. Markley and E. Laue (2002). The CCPN project: An interim report on a data model for the NMR community (Progress report). Nature Struct. Biol. 9, 416-418. Wim F. Vranken, Wayne Boucher, Tim J. Stevens, Rasmus H. Fogh, Anne Pajon, Miguel Llinas, Eldon L. Ulrich, John L. Markley, John Ionides and Ernest D. Laue (2005). The CCPN Data Model for NMR Spectroscopy: Development of a Software Pipeline. Proteins 59, 687 - 696. ===========================REFERENCE END=============================== """ import math import time import Tkinter from memops.general import Implementation from memops.universal.Constants import True, False from memops.universal.Region1D import Region1D from memops.universal.Util import formatDecimals from memops.gui.ButtonList import ButtonList from memops.gui.Color import Color, hexRepr from memops.gui.Label import Label from memops.gui.MessageReporter import showError, showOkCancel from memops.gui.PartitionedSelector import PartitionedSelector from memops.gui.RegionSelector import RegionSelector from memops.gui.ScrolledFrame import ScrolledFrame from memops.gui.ScrolledWindow import ScrolledWindow, \ no_key_state, shift_key_state, ctrl_key_state from memops.gui.ToggleLabel import ToggleLabel from memops.gui.ValueRamp import ValueRamp from memops.editor.Util import createHelpButtonList from ccp.api import Nmr from ccpnmr.api import Analysis try: import ccpnmr.c.ContourFile as ContourFile import ccpnmr.c.ContourStyle as ContourStyle import ccpnmr.c.ContourLevels as ContourLevels import ccpnmr.c.PeakList as PeakList import ccpnmr.c.SliceFile as SliceFile import ccpnmr.c.WinPeakList as WinPeakList except: print 'Warning, the WindowPopup module will not work, you need to compile C code.' ContourFile = ContourStyle = ContourLevels = PeakList = SliceFile = WinPeakList = None from ccpnmr.analysis.BasePopup import BasePopup try: import memops.c.GlHandler as GlHandler except: GlHandler = None try: import memops.c.TkHandler as TkHandler except: TkHandler = None if (not GlHandler and not TkHandler): print 'Warning, the WindowPopup module will not work, you need to compile GlHandler or TkHandler C code.' from ccpnmr.analysis.AssignmentBasic import addPeakResonancesToSeqSpinSystems, propagatePeakAssignments, addPeakResonancesToSpinSystem from ccpnmr.analysis.GetCenterCoordsPopup import GetCenterCoordsPopup from ccpnmr.analysis.MarkBasic import createPeakMark, createNonPeakMark, createRuler, \ removeMarks, removeRulers, createPeakDimRuler from ccpnmr.analysis.PeakBasic import addPeak, addPeakToSelected, getPeakDimPosition, \ removePeakFromSelected, isPeakInRegion, findMatchingPeaks, \ setPeakPosition, findPeaks, searchPeaks, removePeaksAssignment, \ makePeakAnnotation, makeIntermediatePeak, propagatePeakUnaliasing, findPositionMatches from ccpnmr.analysis.PeakFindParams import getPeakFindParams from ccpnmr.analysis.SetReferencePopup import SetReferencePopup from ccpnmr.analysis.SpectrumViewList import SpectrumViewList from ccpnmr.analysis import Util from ccpnmr.analysis.WindowDraw import WindowDraw from ccpnmr.analysis.ExperimentBasic import changeSpectrumContourLevels from ccpnmr.analysis.WindowBasic import getEquivalentWindows, isSpectrumInWindow, getSpectrumWindowView, createSpectrumWindow, centerAxisRegion, zoomToShowPeaks, findOrthogonalWindows, findWindowTransposes # maximum time do double buffer before switch to single buffer doubleBufferTimeout = 0.25 # seconds slice_height_entries = [50, 100, 150, 200] all_label = 'All' # internal class class WindowTimeoutException: pass # public class # put BasePopup first so that lift() from that overrides lift() from WindowDraw class WindowPopup(BasePopup, WindowDraw): waitPeak = 0 waitStrips = 0 waitResize = 0 def __init__(self, parent, window, *args, **kw): # TBD: temporary variables self.drawCanvasCount = 0 self.doCanvasCount = 0 if (not GlHandler): handlerClass = TkHandler.TkHandler useGl = False elif (not TkHandler): handlerClass = GlHandler.GlHandler useGl = True else: project = parent.getProject() graphicsHandler = Util.getGraphicsHandler(project) if (graphicsHandler == 'OpenGL'): handlerClass = GlHandler.GlHandler useGl = True else: handlerClass = TkHandler.TkHandler useGl = False if (useGl): handlerExc = GlHandler.error handlerXorColor = (0.0, 0.0, 0.0) else: handlerExc = TkHandler.error handlerXorColor = (1.0, 1.0, 1.0) self.handlerClass = handlerClass self.handlerExc = handlerExc self.handlerXorColor = handlerXorColor # for xor mode #print 'handler info', handlerClass, handlerXorColor WindowDraw.__init__(self, parent, window) BasePopup.__init__(self, parent=parent, **kw) def body(self, master): self.widget_parent = master self.font = '-schumacher-clean-medium-r-normal--14-140-75-75-c-70-iso646.1991-irv' master.grid_rowconfigure(2, weight=1) master.grid_columnconfigure(0, weight=1) topFrame = ScrolledFrame(master, borderwidth=1, relief='raised', yscroll=False) ### hack ###from memops.gui.Frame import Frame ###topFrame = Frame(master, borderwidth=1, relief='raised') ###topFrame.frame = topFrame ### topFrame.grid(row=0, column=0, sticky=Tkinter.EW) self.lowerFrame = ScrolledFrame(master, borderwidth=2, relief='raised', yscroll=False) #self.lowerFrame.grid(row=1, column=0, sticky=Tkinter.NW) self.toggleLabels = [] col = 0 self.spectraToggleLabel = ToggleLabel(topFrame.frame, text='Spectra', callback=self.toggleSpectraFrame) self.spectraToggleLabel.grid(row = 0, column=col, sticky=Tkinter.W) self.toggleLabels.append(self.spectraToggleLabel) col = col + 1 if (not self.hasValueAxis): self.contourToggleLabel = ToggleLabel(topFrame.frame, text='Contours', callback=self.toggleContourFrame) self.contourToggleLabel.grid(row = 0, column=col, sticky=Tkinter.W) self.toggleLabels.append(self.contourToggleLabel) col = col + 1 else: self.contourToggleLabel = None self.peaksToggleLabel = ToggleLabel(topFrame.frame, text='Peaks', callback=self.togglePeaksFrame) self.peaksToggleLabel.grid(row = 0, column=col, sticky=Tkinter.W) self.toggleLabels.append(self.peaksToggleLabel) col = col + 1 self.stripsToggleLabel = ToggleLabel(topFrame.frame, text='Strips', callback=self.toggleStripsFrame) self.stripsToggleLabel.grid(row = 0, column=col, sticky=Tkinter.W) self.toggleLabels.append(self.stripsToggleLabel) col = col + 1 topFrame.grid_columnconfigure(col, weight=1) self.location_label = Label(topFrame.frame, font=self.font, text = 14*' ') self.location_label.grid(row=0, column=col, sticky=Tkinter.E) self.location_label.bind('<Double-1>', self.getCenterCoords) col = col + 1 xname = self.window.axisPanels[0].axisType.name yname = self.window.axisPanels[1].axisType.name text = ' (%s,%s)' % (xname,yname) label = Label(topFrame.frame, text=text, font=self.font) label.grid(row=0, column=col, sticky=Tkinter.E) col = col + 1 buttonList = createHelpButtonList(topFrame.frame, expands=1, help_url=self.help_url) buttonList.grid(row=0, column=col, sticky=Tkinter.W) col = col + 1 self.toggleWidgets = {} frame = self.lowerFrame.frame # lower frame widgets if (self.contourToggleLabel): self.contourLabel = label = Label(frame, text='Contour level:', font=self.font) self.contourRamp = ValueRamp(frame, callback=self.changeScale) self.contourButton = Tkinter.Button(frame, borderwidth=1, padx=2, pady=2, text='Detailed Settings', command=self.generalContours, font=self.font) self.toggleWidgets[self.contourToggleLabel] = (self.contourLabel, self.contourRamp, self.contourButton) self.spectrumToggleSelector = PartitionedSelector(frame, self.toggleSpectrum) self.toggleWidgets[self.spectraToggleLabel] = (self.spectrumToggleSelector,) self.peaksToggleSelector = PartitionedSelector(frame, self.togglePeaks) self.peakListLabel = Label(frame, text='Peak List:', font=self.font) self.toggleWidgets[self.peaksToggleLabel] = (self.peaksToggleSelector, self.peakListLabel) self.stripsToggleSelector = PartitionedSelector(frame, self.toggleStrips, radio=True) self.stripsButtons = ButtonList(frame, texts=['Add','Remove'],commands=[self.addCol, self.deleteCol],expands=1) self.stripsLabel = Label(frame, text='Active strips:', font=self.font) self.toggleWidgets[self.stripsToggleLabel] = (self.stripsToggleSelector,self.stripsButtons,self.stripsLabel,) ncols = len(self.window.axisPanels[0].axisRegions) nrows = len(self.window.axisPanels[1].axisRegions) if ncols < 2: self.stripsButtons.buttons[1].disable() world_region = self.getWorldRegion() xview_regions = self.getXviewRegions(world_region.x_region) yview_regions = self.getYviewRegions(world_region.y_region) xpanel = self.window.axisPanels[0] ypanel = self.window.axisPanels[1] width = [ axisRegion.size for axisRegion in xpanel.axisRegions ] height = [ axisRegion.size for axisRegion in ypanel.axisRegions ] xslice = xpanel.slicePanel yslice = ypanel.slicePanel show_xslices = xslice.isVisible show_yslices = yslice.isVisible xslice_size = Util.greaterOrEqualEntry(xslice.thickness, slice_height_entries) yslice_size = Util.greaterOrEqualEntry(yslice.thickness, slice_height_entries) show_xscrollbar = xpanel.isVisible show_yscrollbar = ypanel.isVisible self.scrolled_window = ScrolledWindow(master, ncols, nrows, width=width, height=height, world_region=world_region, xview_regions=xview_regions, yview_regions=yview_regions, configure_func=self.resize, expose_func=self.expose, motion_func=self.motion, leave_func=self.leave, slice_configure_func=self.sliceResize, slice_expose_func=self.sliceExpose, slice_motion_func=self.sliceMotion, slice_leave_func=self.leave, view_set_func=self.viewSet, key_func=self.keypress, slice_key_func=self.sliceKeypress, select_single_func=self.selectSingle, select_multi_func=self.selectMulti, drag_func=self.dragBox, show_xslices=show_xslices, show_yslices=show_yslices, xslice_size=xslice_size, yslice_size=yslice_size, get_aspect_ratio = self.getAspectRatio, get_geometry=self.getGeometry, set_geometry=self.setGeometry, has_value_axis=self.hasValueAxis, show_xscrollbar=show_xscrollbar, show_yscrollbar=show_yscrollbar) self.scrolled_window.popup = self # needed for WindowBasic macros for axisPanel in self.window.axisPanels[2:]: self.createRegionSelector(axisPanel) if (not self.hasValueAxis): for slicePanel in self.window.slicePanels[2:]: self.createSliceCanvas(slicePanel) self.gridAll() self.setWindowTitle() #self.setHandlers() #self.setHandlerBackground() self.setViewWindowNames() self.setMenuItems() if (not self.hasValueAxis): self.setSliceMenuItems() self.menuPeak = None self.firstPass = True self.bind('<Configure>', self.getWindowLocation) #self.bind('<FocusIn>', self.focusIn) #self.bind('<Expose>', self.checkIconified) self.bind('<ButtonPress-1>', self.unpostMenu) self.scrolled_window.translateBind(button=2) self.scrolled_window.zoomBind(button=2, state=shift_key_state) self.scrolled_window.selectSingleBind(button=1) self.scrolled_window.selectSingleBind(button=1, state=ctrl_key_state) self.scrolled_window.selectMultiBind(button=1, state=shift_key_state) self.scrolled_window.selectMultiBind(button=1, state=shift_key_state+ctrl_key_state) self.scrolled_window.menuBind(button=3, menu_items=self.menu_items, update_func=self.updateMenuState) if (not self.hasValueAxis): self.scrolled_window.sliceMenuBind(button=3, menu_items=self.slice_menu_items, update_func=self.updateSliceMenuState) self.setSpectrumSelector() self.setStripsSelectorAfter() #if (self.window.isIconified): # self.after_idle(self.close) Implementation.registerNotify(self.setWindowTitle, 'ccpnmr.Analysis.SpectrumWindow', 'setName') Implementation.registerNotify(self.setWindowLocation, 'ccpnmr.Analysis.SpectrumWindow', 'setLocation') Implementation.registerNotify(self.changedAxisTypeRegion, 'ccpnmr.Analysis.AxisType', 'setRegion') Implementation.registerNotify(self.drawAll, 'ccpnmr.Analysis.AxisType', 'setPeakSize') Implementation.registerNotify(self.changedBackgroundColor, 'ccpnmr.Analysis.SpectrumWindow', 'setBackground') Implementation.registerNotify(self.changedAspectRatio, 'ccpnmr.Analysis.SpectrumWindow', 'setAspectRatio') Implementation.registerNotify(self.changedSliceRange, 'ccpnmr.Analysis.SpectrumWindow', 'setSliceRange') Implementation.registerNotify(self.changedIsIconified, 'ccpnmr.Analysis.SpectrumWindow', 'setIsIconified') Implementation.registerNotify(self.changedAxisRegion, 'ccpnmr.Analysis.AxisRegion', 'setRegion') Implementation.registerNotify(self.changedAxisSize, 'ccpnmr.Analysis.AxisRegion', 'setSize') Implementation.registerNotify(self.setStripsSelectorAfter, 'ccpnmr.Analysis.AxisRegion', 'setIsActive') for func in ('__init__', 'delete'): Implementation.registerNotify(self.changedAxisRegions, 'ccpnmr.Analysis.AxisRegion', func) Implementation.registerNotify(self.initSpectrumWindowView, 'ccpnmr.Analysis.SpectrumWindowView', '__init__') Implementation.registerNotify(self.setSpectrumSelector, 'ccpnmr.Analysis.SpectrumWindowView', 'setIsInToolbar') Implementation.registerNotify(self.changedSpectrumWindowView, 'ccpnmr.Analysis.SpectrumWindowView', 'setIsPosVisible') Implementation.registerNotify(self.changedSpectrumWindowView, 'ccpnmr.Analysis.SpectrumWindowView', 'setIsNegVisible') Implementation.registerNotify(self.changedSpectrumWindowViewSlice, 'ccpnmr.Analysis.SpectrumWindowView', 'setIsSliceVisible') Implementation.registerNotify(self.deleteSpectrumWindowView, 'ccpnmr.Analysis.SpectrumWindowView', 'delete') Implementation.registerNotify(self.changedPanelVisibility, 'ccpnmr.Analysis.AxisPanel', 'setIsVisible') Implementation.registerNotify(self.initAxisPanel, 'ccpnmr.Analysis.AxisPanel', '__init__') Implementation.registerNotify(self.deleteAxisPanel, 'ccpnmr.Analysis.AxisPanel', 'delete') Implementation.registerNotify(self.createSliceCanvas, 'ccpnmr.Analysis.SlicePanel', '__init__') Implementation.registerNotify(self.changedSliceVisibility, 'ccpnmr.Analysis.SlicePanel', 'setIsVisible') Implementation.registerNotify(self.changedSliceThickness, 'ccpnmr.Analysis.SlicePanel', 'setThickness') Implementation.registerNotify(self.changedSpectrum, 'ccp.Nmr.DataSource', 'setScale') Implementation.registerNotify(self.setSpectrumSelector, 'ccp.Nmr.DataSource', 'setName') Implementation.registerNotify(self.setSpectrumSelector, 'ccp.Nmr.Experiment', 'setName') Implementation.registerNotify(self.changedPeakList, 'ccp.Nmr.PeakList', 'setPeakColor') Implementation.registerNotify(self.changedPeakList, 'ccp.Nmr.PeakList', 'setPeakSymbol') Implementation.registerNotify(self.setPeaksSelector, 'ccpnmr.Analysis.WindowPeakList', '__init__') Implementation.registerNotify(self.setPeaksSelector, 'ccpnmr.Analysis.WindowPeakList', 'delete') Implementation.registerNotify(self.changedWinPeakList, 'ccpnmr.Analysis.WindowPeakList', 'setIsSymbolDrawn') Implementation.registerNotify(self.changedWinPeakList, 'ccpnmr.Analysis.WindowPeakList', 'setIsAnnotationDrawn') Implementation.registerNotify(self.initPeak, 'ccp.Nmr.Peak', '__init__') Implementation.registerNotify(self.deletePeak, 'ccp.Nmr.Peak', 'delete') Implementation.registerNotify(self.changedPeak, 'ccp.Nmr.Peak', 'setAnnotation') Implementation.registerNotify(self.changedPeakDim, 'ccp.Nmr.PeakDim', 'setPosition') Implementation.registerNotify(self.changedPeakDim, 'ccp.Nmr.PeakDim', 'setAnnotation') Implementation.registerNotify(self.changedMark, 'ccpnmr.Analysis.Mark', '') Implementation.registerNotify(self.changedMark, 'ccpnmr.Analysis.MarkDim', '') Implementation.registerNotify(self.changedMark, 'ccpnmr.Analysis.MarkDim', '__init__') Implementation.registerNotify(self.changedMark, 'ccpnmr.Analysis.MarkDim', 'delete') Implementation.registerNotify(self.changedRuler, 'ccpnmr.Analysis.Ruler', '') Implementation.registerNotify(self.changedRuler, 'ccpnmr.Analysis.Ruler', '__init__') Implementation.registerNotify(self.changedRuler, 'ccpnmr.Analysis.Ruler', 'delete') Implementation.registerNotify(self.changedColor, 'ccpnmr.Analysis.Color', 'setR') Implementation.registerNotify(self.changedColor, 'ccpnmr.Analysis.Color', 'setG') Implementation.registerNotify(self.changedColor, 'ccpnmr.Analysis.Color', 'setB') Implementation.registerNotify(self.changedColor, 'ccpnmr.Analysis.ColorScheme', 'setColorNames') Implementation.registerNotify(self.changedReferencing, 'ccp.Nmr.ExpDimRef', '') Implementation.registerNotify(self.changedReferencing, 'ccp.Nmr.DataDimRef', '') Implementation.registerNotify(self.changedReferencing, 'ccp.Nmr.FreqDataDim', '') for func in ('__init__', 'delete', 'setValue'): for t in ('Int', 'Float', 'String', 'Boolean'): clazz = 'memops.Implementation.AppData' + t Implementation.registerNotify(self.changedAppData, clazz, func) # following five functions just used to keep isIconified up-to-date def open(self): #print 'WindowPopup open' self.window.isIconified = False self.update_idletasks() BasePopup.open(self) def deiconify(self): #print 'WindowPopup deiconify' self.window.isIconified = False BasePopup.deiconify(self) def iconify(self): #print 'WindowPopup iconify' self.window.isIconified = True BasePopup.iconify(self) def close(self): #print 'WindowPopup close' self.window.isIconified = True BasePopup.close(self) def withdraw(self): #print 'WindowPopup withdraw' self.window.isIconified = True BasePopup.withdraw(self) """ def checkIconified(self, *event): # if you do this too early then window location is trampled when uniconified # a bit of a pain because it leads to a flash of the window if (self.firstPass): self.firstPass = False if (self.window.isIconified): self.close() """ def changedIsIconified(self, window): if (self.window == window): if (window.isIconified): self.close() else: self.open() def getCenterCoords(self, *event): popup = GetCenterCoordsPopup(self) center = popup.center region_number = popup.region_number popup.destroy() if (center): (cx, cy) = center (rx, ry) = region_number xaxisPanel = self.window.axisPanels[0] yaxisPanel = self.window.axisPanels[1] (x0, x1) = xaxisPanel.axisRegions[rx].region (y0, y1) = yaxisPanel.axisRegions[ry].region tx = (cx - 0.5*(x0+x1)) / (x1 - x0) ty = (cy - 0.5*(y0+y1)) / (y1 - y0) if (xaxisPanel.axisUnit.isBackwards): tx = - tx if (yaxisPanel.axisUnit.isBackwards): ty = - ty canvas = self.scrolled_window.canvases[ry][rx] self.scrolled_window.translate(canvas, tx, ty) def setSpectrumSelector(self, *notifyObj): spectra = [] colors = [] labels = [] views = [] refViews = list(self.window.spectrumWindowViews) refViews.sort(self.compareViewOrder) for view in refViews: try: # try needed for dodgy notifier for deleted spectrum - view still exists spectrum = view.dataSource ###views.append(view) # moved by wb104 on 30 03 2005 to inside if statement below # need below check because changing app date on delete calls this update before the view is removed if spectrum and view.isInToolbar: views.append(view) colorName = Util.getSpectrumPosContourColor(spectrum) scheme = self.window.root.findFirstColorScheme(name=colorName) if scheme: color = scheme.colors[int(len(scheme.colors)*0.8)] specColor = hexRepr(color.r, color.g, color.b) else: specColor = 'grey83' spectra.append( spectrum ) colors.append( specColor ) labels.append('%s:%s' % (spectrum.experiment.name,spectrum.name)) except: pass self.spectrumToggleSelector.update(objects=spectra,labels=labels,colors=colors) n = 0 for view in views: self.spectrumToggleSelector.setButtonState(n, view.isPosVisible) n = n + 1 self.setPeaksSelector() def setPeaksSelector(self, *notifyObj): if self.window.isDeleted: return peakLists = [] colors = [] labels = [] views = [] winPeakLists = [] allViews = list(self.window.spectrumWindowViews) allViews.sort(self.compareViewOrder) for view in allViews: try: # try needed for dodgy notifier for deleted spectrum - view still exists spectrum = view.dataSource # need below check because changing app date on delete calls this update before the view is removed if spectrum and view.isPosVisible and view.isInToolbar: views.append( view ) if view.windowPeakLists: colorName = Util.getSpectrumPosContourColor(spectrum) scheme = self.window.root.findFirstColorScheme(name=colorName) if scheme: color = scheme.colors[int(len(scheme.colors)*0.8)] specColor = hexRepr(color.r, color.g, color.b) else: specColor = 'grey83' for winPeakList in view.windowPeakLists: try: peakList = winPeakList.peakList except: peakList = None if not peakList or peakList.isDeleted: continue winPeakLists.append(winPeakList) peakLists.append(peakList) colors.append( specColor ) labels.append('%s:%s:%d' % (spectrum.experiment.name,spectrum.name,peakList.serial)) except: pass self.peaksToggleSelector.update(objects=peakLists,labels=labels,colors=colors) n = 0 for winPeakList in winPeakLists: self.peaksToggleSelector.setButtonState(n, winPeakList.isSymbolDrawn) n += 1 def setStripsSelectorAfter(self, *notifyObj): if self.waitStrips: return else: self.waitStrips = 1 self.after_idle(self.setStripsSelector) def setStripsSelector(self): if self.window.isDeleted: return axisRegions = self.window.axisPanels[0].axisRegions N = len(axisRegions) if N == 0: self.stripsToggleSelector.grid_forget() elif N ==1: self.stripsToggleSelector.update(objects=[axisRegions[0],],labels=['1',],colors=['#80A080',]) self.stripsToggleSelector.selectButton(0, doCallback=False) else: objects = ['all',] labels = ['All',] colors = ['#80A080',] for i in range(N): objects.append(axisRegions[i]) labels.append('%d' % (i+1)) colors.append('#80A080') self.stripsToggleSelector.update(objects=objects,labels=labels,colors=colors) for i in range(N): axisRegion = axisRegions[i] if axisRegion.isActive: axisPanels = [panel for panel in axisRegion.axisPanel.spectrumWindow.axisPanels[2:] if not panel.isDeleted] for axisPanel in axisPanels: (r0, r1) = Util.checkSwapRegion(axisPanel.axisRegions[i].region, axisPanel.axisUnit) axisPanel.region_selector.setViewRegion(r0, r1) break M = 0 I = 0 for i in range(N): if axisRegions[i].isActive: I = i M += 1 if M == N: for i in range(N): self.stripsToggleSelector.selectButton(0, doCallback=False) else: self.stripsToggleSelector.selectButton(I+1, doCallback=False) self.waitStrips = 0 def toggleSpectrum(self, spectrum): self.parent.toggleSpectrum(self.window, spectrum=spectrum) self.setPeaksSelector() def togglePeaks(self, peakList): self.parent.togglePeakList(self.window, peakList) def toggleStrips(self, object): axisRegions = list(self.window.axisPanels[0].axisRegions) if object == 'all': for axisRegion in axisRegions: axisRegion.isActive = True else: for axisRegion in axisRegions: axisRegion.isActive = False axisRegion = object axisRegion.isActive = True col = axisRegions.index(axisRegion) self.updateRegionSelectors(col) def getActiveStrip(self): axisRegions = self.window.axisPanels[0].axisRegions for n in range(len(axisRegions)): axisRegion = axisRegions[n] if (axisRegion.isActive): if (n == 0): break else: return n else: return None for m in range(1, len(axisRegions)): axisRegion = axisRegions[m] if (not axisRegion.isActive): return n return 'all' def activateStrip(self, col): #print 'activateStrip', col axisRegions = self.window.axisPanels[0].axisRegions N = len(axisRegions) if col >= N: col = 0 for i in range(N): axisRegion = axisRegions[i] if i == col: axisRegion.isActive = True else: axisRegion.isActive = False self.updateRegionSelectors(col) def updateRegionSelectors(self, col): for axisPanel in self.window.axisPanels[2:]: axisRegion = axisPanel.axisRegions[col] (r0, r1) = Util.checkSwapRegion(axisRegion.region, axisPanel.axisUnit) axisPanel.region_selector.setViewRegion(r0, r1, do_callback=True) def untoggleLabels(self, shownLabel): self.waitResize = 1 for toggleLabel in self.toggleLabels: if (toggleLabel is not shownLabel): toggleLabel.arrowOff() for widget in self.toggleWidgets[toggleLabel]: widget.grid_forget() self.update_idletasks() self.waitResize = 0 def toggleContourFrame(self, isHidden): self.waitResize = 1 if isHidden: self.lowerFrame.grid_forget() self.contourLabel.grid_forget() self.contourRamp.grid_forget() self.contourButton.grid_forget() else: self.contourLabel.grid (row = 0, column = 0,sticky=Tkinter.NW) self.contourRamp.grid (row = 0, column = 1,sticky=Tkinter.NW) self.contourButton.grid(row = 0, column = 2,sticky=Tkinter.NW) self.lowerFrame.grid (row = 1, column = 0,sticky=Tkinter.EW) self.untoggleLabels(self.contourToggleLabel) def toggleSpectraFrame(self, isHidden): self.waitResize = 1 if isHidden: self.lowerFrame.grid_forget() self.spectrumToggleSelector.grid_forget() else: self.spectrumToggleSelector.grid(row = 0, column = 0,sticky=Tkinter.NSEW) self.lowerFrame.grid(row = 1, column = 0,sticky=Tkinter.EW) self.untoggleLabels(self.spectraToggleLabel) def togglePeaksFrame(self, isHidden): self.waitResize = 1 if isHidden: self.lowerFrame.grid_forget() self.peaksToggleSelector.grid_forget() self.peakListLabel.grid_forget() else: self.peakListLabel.grid(row = 0, column = 0,sticky=Tkinter.NSEW) self.peaksToggleSelector.grid(row = 0, column = 1,sticky=Tkinter.NSEW) self.lowerFrame.grid(row = 1, column = 0,sticky=Tkinter.EW) self.untoggleLabels(self.peaksToggleLabel) def toggleStripsFrame(self, isHidden): self.waitResize = 1 if isHidden: self.lowerFrame.grid_forget() self.stripsToggleSelector .grid_forget() self.stripsButtons.grid_forget() self.stripsLabel.grid_forget() else: self.stripsLabel.grid(row = 0, column = 0,sticky=Tkinter.W) self.stripsToggleSelector.grid(row = 0, column = 1,sticky=Tkinter.EW) self.stripsButtons.grid(row = 0, column = 2,sticky=Tkinter.EW) self.lowerFrame.grid(row = 1, column = 0,sticky=Tkinter.EW) self.untoggleLabels(self.stripsToggleLabel) def unpostMenu(self, *event): self.scrolled_window.menu.unpost() if (not self.hasValueAxis): self.scrolled_window.sliceMenu.unpost() def moveStripToWindow(self, sourceCol, window=None, targetCol=0): if window is self.window: self.shuffleAxisRegions(sourceCol=sourceCol, targetCol=targetCol) return strip = self.window.axisPanels[0].axisRegions[sourceCol] if window: popup = self.parent.getWindowPopup(window.name) popup.open() # otherwise if window closed Python crashes if targetCol >= len(window.axisPanels[0].axisRegions): targetCol = len(window.axisPanels[0].axisRegions) popup.addCol(col=targetCol) else: i = len(self.project.spectrumWindows) name = 'window%s' % i while self.project.findFirstSpectrumWindow(name = name): i += 1 name = 'window%s' % i axisTypes = [] for axisPanel in self.window.axisPanels: axisTypes.append(axisPanel.axisType) window = createSpectrumWindow(self.project, name, axisTypes, ncols=1, nrows=1) if window is self.window: if targetCol < sourceCol: sourceCol += 1 for i in range(len(self.window.axisPanels)): if sourceCol < len( self.window.axisPanels[i].axisRegions) \ and targetCol < len( window.axisPanels[i].axisRegions): sourceStrip = self.window.axisPanels[i].axisRegions[sourceCol] targetStrip = window.axisPanels[i].axisRegions[targetCol] targetStrip.region = tuple(sourceStrip.region) targetStrip.size = sourceStrip.size self.deleteCol(col=sourceCol) def getMoveStripItems(self, col): items = [{ 'kind': 'command', 'label': 'New window', 'command': lambda event, s=col:self.moveStripToWindow(s) }] windows = getEquivalentWindows(self.window) for window in windows: axisRegions = window.axisPanels[0].axisRegions for i in range(len(axisRegions)+1): if (window is self.window) and ( (i == col) or (i == len(axisRegions)) ): continue label = '%s strip %d' % (window.name,i+1) item = { 'kind': 'command', 'label': label, 'command': lambda event, w=window, s=col, t=i: self.moveStripToWindow(s,w,t) } items.append(item) return items # TBD: dangerous way this done here, using explicit indices into submenus def updateMenuState(self): event = self.scrolled_window.menu.menu_event canvas = event.widget (x, y, propX, propY) = self.scrolled_window.calcWorldCoord(canvas, event.x, event.y) (row, col) = self.scrolled_window.getCanvasRowCol(canvas) #print 'updateMenuState', row, col xAxisRegion = self.window.axisPanels[0].axisRegions[col] yAxisRegion = self.window.axisPanels[1].axisRegions[row] # View option if not self.hasValueAxis: view_menu = self.scrolled_window.menu.submenuDict['View'] if self.window.spectrumWindowViews: state = Tkinter.NORMAL else: state = Tkinter.DISABLED view_menu.entryconfig(2, state=state) # Strip option strip_items = [] if not self.hasValueAxis: if len(self.window.axisPanels[0].axisRegions) > 1: move_strip_items = self.getMoveStripItems(col) strip_items = [ \ { 'kind': 'command', 'label': 'Add new strip','command': lambda event, col=col: self.addCol(col=col+1) }, { 'kind': 'command', 'label': 'Remove strip', 'command': lambda event, col=col: self.deleteCol(col=col) }, { 'kind': 'cascade', 'label': 'Change window','submenu': move_strip_items }, { 'kind': 'command', 'label': 'Make active', 'command': lambda event, col=col: self.activateStrip(col) }, { 'kind': 'command', 'label': 'Add horizontal separator', 'command': self.addRow }, ] else: strip_items = [ \ { 'kind': 'command', 'label': 'Add new strip', 'command': lambda event: self.addCol() }, { 'kind': 'command', 'label': 'Add horizontal separator', 'command': self.addRow }, ] if self.scrolled_window.nrows > 1: strip_items.append( { 'kind': 'command', 'label': 'Remove horizontal separator', 'command': lambda event: self.deleteRow() } ) stripMenu = self.scrolled_window.menu.submenuDict['Strip'] stripMenu.setMenuItems(strip_items) # peak and assign options if (not self.hasValueAxis): position_region = self.findPositionRegion(x, y, col) activeViews = self.getActiveSpectrumViews() for view in activeViews: peak = self.findNearbyViewPeak(view, position_region, xAxisRegion, yAxisRegion) if (peak): break else: peak = None find_items = [] seqss_items = [] if peak: label = 'Assign %s:%s:%s:%s' % (peak.peakList.dataSource.experiment.name,peak.peakList.dataSource.name, peak.peakList.serial, peak.serial) state = Tkinter.NORMAL i = 1 for peakDim in peak.peakDims: expDimRef = peakDim.dataDim.expDim.expDimRefs[0] isotopesCode = '' for isotope in expDimRef.isotopeCodes: isotopesCode = isotopesCode + isotope text = 'F%d: %s %7.3f %s' % (i,isotopesCode,getPeakDimPosition(peakDim,toUnit=expDimRef.unit),expDimRef.unit) find_items.append({'kind': 'command', 'label':text, 'command': lambda event, pd=peakDim: self.findClosePeaks(pd)}) i += 1 seqOffsets = [] N = len(peak.peakDims) if N == 2: seqOffsets = [(None, -1),(None,1)] elif N == 3: seqOffsets = [(None,-1,None),(None,1,None),(-1,None,None),(1,None,None)] elif N == 4: seqOffsets = [(-1,-1,None,None),(1,1,None,None),(None,-1,-1,None),(None,1,1,None)] elif N == 5: seqOffsets = [(-1,-1,None,None,None),(1,1,None,None,None), (-1,-1,-1,None,None), (1,1,1,None,None)] for seqOffset in seqOffsets: text = [] f = 1 for j in seqOffset: if j is None: text.append('F%d 0' % (f) ) elif j > 0: text.append('F%d +%d' % (f,j) ) else: text.append('F%d %d' % (f,j) ) f += 1 seqss_items.append({'kind': 'command', 'label':','.join(text), 'command': lambda event, s=seqOffset: self.makeSeqSpinSystemConnections(s)}) else: label = 'Assign peak' state = Tkinter.DISABLED self.menuPeak = peak assn_menu = self.scrolled_window.menu.submenuDict['Assign'] assn_menu.entryconfig(0, state=state, label=label) assn_menu.entryconfig(2, state=state) assn_menu.entryconfig(5, state=state) seqss_menu = assn_menu.submenuDict['Set sequential spin systems'] seqss_menu.setMenuItems(seqss_items) peak_menu = self.scrolled_window.menu.submenuDict['Peak'] peak_menu.entryconfig(2, state=Tkinter.NORMAL) peak_menu.entryconfig(3, state=state) peak_menu.entryconfig(5, state=state) peak_menu.entryconfig(7, state=state) peak_menu.entryconfig(8, state=state) peak_menu.entryconfig(9, state=state) peak_menu.entryconfig(10, state=state) peak_menu.entryconfig(13, state=state) find_menu = peak_menu.submenuDict['Find close peaks'] find_menu.setMenuItems(find_items) state = Tkinter.DISABLED if peak: for peakDim in peak.peakDims: for contrib in peakDim.peakDimContribs: if contrib.resonance.resonanceGroup: state = Tkinter.NORMAL break else: continue break assn_menu.entryconfig(3, state=state) state = Tkinter.DISABLED match_items = [] peakLists = self.getActivePeakLists() if peakLists and self.parent.currentPeaks: state = Tkinter.NORMAL peak = self.parent.currentPeaks[0] for peakList in peakLists: spectrum = peakList.dataSource specText = 'In %s:%s:%d' % (spectrum.experiment.name,spectrum.name,peakList.serial) dim_items = [] # TBD: Automate this to give only options for non-aligned peakDims for i in range(spectrum.numDim): text = 'F%d' % (i+1) dim_items.append({'kind': 'command', 'label':text, 'command': lambda event, p=self.parent.currentPeaks, i=i, pl=peakList: self.findPositionMatches(p,i,pl)}) match_items.append({'kind': 'cascade', 'label':specText, 'submenu': dim_items}) dim_items = [] for i in range(len(peak.peakDims)): text = 'F%d' % (i+1) dim_items.append({'kind': 'command', 'label':text,'command': lambda event, p=self.parent.currentPeaks, i=i: self.findPositionMatches(p,i)}) match_items.append({'kind': 'cascade', 'label':'In active spectra', 'submenu': dim_items}) match_menu = peak_menu.submenuDict['Match peaks'] match_menu.setMenuItems(match_items) assn_menu.entryconfig(1, state=state) assn_menu.entryconfig(2, state=state) assn_menu.entryconfig(4, state=state) peak_menu.entryconfig(0, state=state) peak_menu.entryconfig(4, state=state) peak_menu.entryconfig(6, state=state) peak_menu.entryconfig(7, state=state) peak_menu.entryconfig(9, state=state) peak_menu.entryconfig(12, state=state) state = Tkinter.DISABLED if peak and self.parent.currentPeaks: state = Tkinter.NORMAL peak_menu.entryconfig(11, state=state) # Navigate option views = self.getActiveSpectrumViews() goto_items = [] cursorPosition = self.findPosition(x,y,col,returnDict=False) windowZplanes = findOrthogonalWindows(self.window, cursorPosition) transposes = findWindowTransposes( self.window, cursorPosition) if windowZplanes: for (planeName, window, position) in windowZplanes: goto_items.append({'kind': 'command', 'label': planeName, 'command': lambda event, window=window, position=position: self.gotoOrthogonalPlane(window, position)} ) if len(windowZplanes) > 1: goto_items.append({'kind': 'command','label': 'All window positions', 'command': lambda event, wzps=windowZplanes: self.gotoOrthogonalAllPlanes(wzps)} ) if transposes: if windowZplanes: goto_items.append({ 'kind': 'separator'}) if len(transposes) > 1: transpose_items = [] for label, position in transposes: transpose_items.append({'kind': 'command', 'label': label, 'command': lambda event, w=self.window, pos=position, col=col: self.parent.gotoPosition(window_name=w.name, position=pos, col=col)}) goto_items.append({'kind': 'cascade', 'label':'Transpose', 'submenu': transpose_items}) else: label, position = transposes[0] goto_items.append({'kind': 'command', 'label': 'Transpose '+label, 'command': lambda event, w=self.window, pos=position, col=col: self.parent.gotoPosition(window_name=w.name, position=pos, col=col)}) goto_menu = self.scrolled_window.menu.submenuDict['Navigate'] goto_menu.setMenuItems(goto_items) # mark & rulers options mark_menu = self.scrolled_window.menu.submenuDict['Markers'] project = self.window.project state = Tkinter.DISABLED if project.marks: state = Tkinter.NORMAL mark_menu.entryconfig(3, state=state) # marks state = Tkinter.DISABLED if project.rulers: state = Tkinter.NORMAL mark_menu.entryconfig(4, state=state) # rulers # macros options argServer = self.parent.argumentServer macro_menu = self.scrolled_window.menu.submenuDict['Macros'] macro_items = [{ 'kind': 'command', 'label': 'Reload macros', 'command': self.reloadMouseMacros, 'shortcut': 'R' }] for macro in self.project.macros: if Util.getIsMacroInMouseMenu(macro): macro_items.append( {'kind': 'command', 'label': macro.name, 'command': lambda event, m=macro: Util.runMacro(m,argServer)} ) macro_menu.setMenuItems(macro_items) state = Tkinter.DISABLED if len(macro_items) > 1: state = Tkinter.NORMAL macro_menu.entryconfig(0, state=state) self.setCurrentObjects(event) self.parent.currentPeakLists = [] views = self.getActiveSpectrumViews() for view in views: for winPeakList in view.windowPeakLists: if winPeakList.isSymbolDrawn: try: peakList = winPeakList.peakList except: peakList = None if (peakList and not peakList.isDeleted): self.parent.currentPeakLists.append(peakList) self.parent.currentPosition = (x,y) def setCurrentObjects(self, event): canvas = event.widget (row, col) = self.scrolled_window.getCanvasRowCol(canvas) views = self.getActiveSpectrumViews() self.parent.currentPeak = self.menuPeak self.parent.currentWindow = self.window self.parent.currentStrip = col self.parent.currentWindowPopup = self self.parent.currentSpectra = [view.dataSource for view in views] self.parent.currentCanvas = canvas self.parent.currentEvent = event def reloadMouseMacros(self, *event): for macro in self.project.macros: if Util.getIsMacroInMouseMenu(macro): Util.reloadMacro(macro, self.parent.argumentServer) # TBD: more general def setMenuItems(self): zoom_items = [ \ { 'kind': 'command', 'label': 'Out by 2', 'command': lambda event: self.zoom(event.widget, 2.0) }, { 'kind': 'command', 'label': 'In by 2', 'command': lambda event: self.zoom(event.widget, 0.5) }, { 'kind': 'command', 'label': 'Zoom to slected peaks', 'command': self.zoomToSelectedPeaks }, { 'kind': 'command', 'label': 'Zoom to spin system peaks', 'command': self.zoomToSpinSystem }, ] mark_items = [ \ { 'kind': 'command', 'label': 'Add Mark', 'command': self.createMark, 'shortcut': 'M' }, { 'kind': 'command', 'label': 'Add Horizontal ruler', 'command': self.createHorizontalRuler, 'shortcut': 'H' }, { 'kind': 'command', 'label': 'Add Vertical ruler', 'command': self.createVerticalRuler, 'shortcut': 'V' }, { 'kind': 'command', 'label': 'Remove marks', 'command': self.clearMarks }, { 'kind': 'command', 'label': 'Remove rulers', 'command': self.clearRulers }, ] strip_items = [ \ { 'kind': 'command', 'label': 'Add new strip', 'command': lambda: self.addCol() }, { 'kind': 'command', 'label': 'Add horizontal separator', 'command': self.addRow }, { 'kind': 'command', 'label': 'Remove horizontal separator', 'command': lambda event: self.deleteRow() }, ] contour_items = [] if (not self.hasValueAxis): find_items = [] # created properly when menu pops up match_items = [] # created properly when menu pops up macro_items = [] # created properly when menu pops up seqss_items = [] # created properly when menu pops up merit_items = [] merit_items.append({'kind': 'command', 'label':'0.0', 'command': lambda event, m=0.0: self.setPeakMerit(m)}) merit_items.append({'kind': 'command', 'label':'0.5', 'command': lambda event, m=0.5: self.setPeakMerit(m)}) merit_items.append({'kind': 'command', 'label':'1.0', 'command': lambda event, m=1.0: self.setPeakMerit(m)}) assn_items = [ \ { 'kind': 'command', 'label': 'Assign peak', 'command': self.assignPeak }, { 'kind': 'command', 'label': 'Propagate assignments', 'command': self.propagatePeakAssignments }, { 'kind': 'command', 'label': 'Add to spin system', 'command': self.addPeakSpinSystem }, { 'kind': 'command', 'label': 'Predict Spin System Type', 'command': self.predictSpinSystemType }, { 'kind': 'command', 'label': 'Deassign selected peaks', 'command': self.clearPeakAssignments }, { 'kind': 'cascade', 'label': 'Set sequential spin systems','submenu': seqss_items }, ] peak_items = [ \ { 'kind': 'command', 'label': 'Selected peaks...', 'command': self.showSelectedPeaks }, { 'kind': 'separator'}, { 'kind': 'command', 'label': 'Add new peak', 'command': self.createPeak }, { 'kind': 'command', 'label': 'Center z planes on peak', 'command': self.peakCenterOrthogonalPlanes }, { 'kind': 'command', 'label': 'Delete selected peaks', 'command': self.deleteSelectedPeaks }, { 'kind': 'cascade', 'label': 'Find close peaks', 'submenu': find_items }, { 'kind': 'command', 'label': 'Make intermediate peak', 'command': self.makeIntermediatePeak }, { 'kind': 'cascade', 'label': 'Match peaks', 'submenu': match_items }, { 'kind': 'cascade', 'label': 'Set merit', 'submenu': merit_items }, { 'kind': 'command', 'label': 'Show structure connections','command': self.showStructConnections }, { 'kind': 'command', 'label': 'Unalias peak', 'command': self.unaliasPeak }, { 'kind': 'command', 'label': 'Unaliasing propagate', 'command': self.propagatePeakUnaliasing }, { 'kind': 'command', 'label': 'Zoom to slected peaks', 'command': self.zoomToSelectedPeaks }, { 'kind': 'command', 'label': 'Zoom to spin system peaks', 'command': self.zoomToSpinSystem }, ] contour_items = [ \ { 'kind': 'command', 'label': 'Up by 2', 'command': lambda event: self.changeScale(2.0) }, { 'kind': 'command', 'label': 'Down by 2', 'command': lambda event: self.changeScale(0.5) }, { 'kind': 'command', 'label': 'General...', 'command': lambda event: self.generalContours() }, ] #split_items = [ \ # { 'kind': 'command', 'label': 'Horizontally', 'command': self.splitWindowHorizontal }, # { 'kind': 'command', 'label': 'Vertically', 'command': self.splitWindowVertical }, #] view_items = [ \ { 'kind': 'cascade', 'label': 'Zoom', 'submenu' : zoom_items }, { 'kind': 'command', 'label': 'Center here', 'command' : self.center }, { 'kind': 'cascade', 'label': 'Contour levels', 'submenu' : contour_items }, { 'kind': 'command', 'label': 'Window properties...', 'command' : self.editWindow }, ] goto_items = [] # created properly when menu pops up if (not self.hasValueAxis): self.menu_items = [ \ { 'kind': 'cascade', 'label': 'Assign', 'submenu': assn_items }, { 'kind': 'cascade', 'label': 'Peak', 'submenu': peak_items }, { 'kind': 'cascade', 'label': 'View', 'submenu': view_items }, { 'kind': 'cascade', 'label': 'Navigate', 'submenu': goto_items }, { 'kind': 'cascade', 'label': 'Strip', 'submenu': strip_items }, { 'kind': 'cascade', 'label': 'Markers', 'submenu': mark_items }, { 'kind': 'separator'}, { 'kind': 'cascade', 'label': 'Macros', 'submenu': macro_items }, #{ 'kind': 'cascade', 'label': 'Split screen', 'submenu': split_items }, ] else: # self.hasValueAxis self.menu_items = [ \ { 'kind': 'cascade', 'label': 'View', 'submenu': view_items }, { 'kind': 'cascade', 'label': 'Navigate', 'submenu': goto_items }, { 'kind': 'cascade', 'label': 'Strip', 'submenu': strip_items }, { 'kind': 'cascade', 'label': 'Markers', 'submenu': mark_items }, { 'kind': 'separator'}, { 'kind': 'cascade', 'label': 'Macros', 'submenu': macro_items }, ] # TBD: dangerous way this done here, using explicit indices into submenus def updateSliceMenuState(self): slice_menu = self.scrolled_window.sliceMenu views = self.getActiveSliceViews() if (len(views) == 1): state = Tkinter.NORMAL else: state = Tkinter.DISABLED slice_menu.entryconfig(0, state=state) # reference # TBD: more general def setSliceMenuItems(self): self.slice_menu_items = [ \ { 'kind': 'command', 'label': 'Reference...', 'command' : self.reference }, ] def assignPeak(self, *event): self.parent.assignmentPanel() if (self.menuPeak): self.parent.popups['edit_assignment'].update(self.menuPeak) def unaliasPeak(self, event): if (self.menuPeak): self.parent.editPeakAliasing(peak=self.menuPeak) def setPeakMerit(self, merit): if (self.menuPeak): self.menuPeak.figOfMerit = min(1,max(0,merit)) makePeakAnnotation(self.menuPeak) def deleteSelectedPeaks(self, *event): self.parent.queryDeleteSelected() def showSelectedPeaks(self, *event): self.parent.viewSelectedPeaks() def findClosePeaks(self, peakDim): project = peakDim.root expDimRefs = peakDim.dataDim.expDim.expDimRefs peaks = [] for experiment in project.nmrExperiments: for spectrum in experiment.dataSources: for peakList in spectrum.peakLists: peaks.extend( findMatchingPeaks(peakList, peakDim) ) # tbd with isotope checks peaks2 = [] ppm = peakDim.value for peak in peaks: minD = abs(peak.peakDims[0].value-ppm) for peakDim2 in peak.peakDims[1:]: d = abs(peakDim2.value-ppm) if d < minD: minD = d peaks2.append( (minD, peak) ) peaks2.sort() peaks = [x[1] for x in peaks2] self.parent.viewPeaks(peaks) def propagatePeakAssignments(self, event): peaks = self.parent.currentPeaks if peaks: propagatePeakAssignments(peaks) def propagatePeakUnaliasing(self, event): refPeak = self.menuPeak peaks = self.parent.currentPeaks if refPeak and peaks: message = 'Propagate unaliasing from peak\nto all selected peaks?\n' i = 0 for peakDim in refPeak.peakDims: i += 1 message += 'Dimension %d: Num aliasing %d\n(Ref peak position %f)\n' % (i,peakDim.numAliasing, peakDim.value) if showOkCancel('Confirm',message): propagatePeakUnaliasing(refPeak, peaks) def addPeakSpinSystem(self, event): peaks = self.parent.currentPeaks if peaks: addPeakResonancesToSpinSystem(peaks) def clearPeakAssignments(self, event): peaks = self.parent.currentPeaks if peaks: if showOkCancel('Warning','Clear assignments for %d selected peaks?' % len(peaks)): removePeaksAssignment(peaks) def createMark(self, event): self.doCreateMark(event.widget, event.x, event.y) def createHorizontalRuler(self, event): self.doCreateHorizontalRuler(event.widget, event.x, event.y) def createVerticalRuler(self, event): self.doCreateVerticalRuler(event.widget, event.x, event.y) def createPeak(self, event): canvas = event.widget (a, b, x, y) = self.scrolled_window.calcWorldCoord(canvas, event.x, event.y) (row, col) = self.scrolled_window.getCanvasRowCol(canvas) self.createNewPeak(a, b, col) def clearMarks(self, *event): removeMarks(self.window.project, removeAll=True) def clearRulers(self, *event): removeRulers(self.window.project, removeAll=True) def changeScale(self, factor): views = self.getActiveSpectrumViews() for view in views: spectrum = view.dataSource changeSpectrumContourLevels(spectrum, factor) def generalContours(self): views = self.getActiveSpectrumViews() if (views): spectrum = views[0].dataSource else: spectrum = None self.parent.editContourLevels(spectrum) def center(self, event): self.centerAtLocation(event.widget, event.x, event.y) def centerAtLocation(self, canvas, x, y): (a, b, s, t) = self.scrolled_window.calcWorldCoord(canvas, x, y) #print 'center', a, b, s, t s = s - 0.5 if (not self.hasValueAxis): t = t - 0.5 else: t = 0 #self.scrolled_window.translate(canvas, s, t) self.translate(canvas, s, t) def translate(self, canvas, sx, sy): #f = 0.5 #self.scrolled_window.translate(canvas, f*sx, f*sy) self.scrolled_window.translate(canvas, sx, sy) def zoom(self, canvas, scale): self.scrolled_window.zoom(canvas, scale) def reference(self, event): views = self.getActiveSpectrumViews() if (len(views) != 1): return view = views[0] slice = event.widget if (slice.orient == Tkinter.HORIZONTAL): w = slice.slice_width x = event.x s = (x + 0.5) / w axisPanel = self.window.axisPanels[0] else: h = slice.slice_height y = h - 1 - event.y s = (y + 0.5) / h axisPanel = self.window.axisPanels[1] axisMapping = view.findFirstAxisMapping(label=axisPanel.label) if (not axisMapping): return dataDim = axisMapping.dataDim (t0, t1) = slice.view_region t = t0 * (1 - s) + t1 * s t = Util.convertPosition(t, dataDim.dataDimRefs[0], fromUnit=axisPanel.axisUnit.unit) popup = SetReferencePopup(self, dataDim, t) popup.destroy() def editWindow(self, *event): self.parent.editWindow(self.window) def isInAllowedRegion(self, dataDim, label, region): if label in ('x', 'y'): r0 = r1 = region else: (r0, r1) = region dataDimRef = dataDim.dataDimRefs[0] expDimRef = dataDimRef.expDimRef minAliasedFreq = expDimRef.minAliasedFreq maxAliasedFreq = expDimRef.maxAliasedFreq if (minAliasedFreq is None): minFreq = Util.convertPosition(1.0, dataDimRef, toUnit='ppm') else: minFreq = minAliasedFreq if r0 < minFreq: return False if (maxAliasedFreq is None): maxFreq = Util.convertPosition(dataDim.numPoints, dataDimRef, toUnit='ppm') else: maxFreq = maxAliasedFreq if r1 > maxFreq: return False return True def findNearbyViewPeak(self, view, position_region, xAxisRegion, yAxisRegion): spectrum = view.dataSource peakList = Util.getSpectrumActivePeakList(spectrum) if (not peakList): return None winPeakList = view.findFirstWindowPeakList(peakList=peakList) if (not winPeakList): return None if not winPeakList.isSymbolDrawn: return None (xscale, yscale) = self.getPeakScale(view, xAxisRegion, yAxisRegion) spectrum_region = spectrum.numDim * [0] for axisMapping in view.axisMappings: dataDim = axisMapping.dataDim dim = axisMapping.dim - 1 label = axisMapping.label if (not self.isInAllowedRegion(dataDim, label, position_region[label])): return None if (label == 'x'): xdim = dim elif (label == 'y'): ydim = dim axisPanel = self.window.findFirstAxisPanel(label=label) spectrum_region[dim] = self.convertPositionRegion(position_region[label], axisPanel, dataDim) #print 'findNearbyViewPeak', spectrum.name, spectrum_region peak = self.findNearbyPeak(peakList, spectrum_region, xdim, ydim, xscale, yscale) return peak def selectSingle(self, canvas, a, b, x, y, button = 1, state = no_key_state, newSelection = True): if (button != 1): return # TBD: something if (self.hasValueAxis): return self.parent.startSelection() if (newSelection): self.parent.clearSelected() (row, col) = self.scrolled_window.getCanvasRowCol(canvas) if (state != ctrl_key_state): xAxisRegion = self.window.axisPanels[0].axisRegions[col] yAxisRegion = self.window.axisPanels[1].axisRegions[row] position_region = self.findPositionRegion(a, b, col) #print 'selectSingle1', position_region activeViews = self.getActiveSpectrumViews() for view in activeViews: peak = self.findNearbyViewPeak(view, position_region, xAxisRegion, yAxisRegion) if (peak): if (not newSelection and self.parent.isSelected(peak)): removePeakFromSelected(peak, self.parent) else: addPeakToSelected(peak, parent=self.parent) else: self.createNewPeak(a, b, col) self.parent.endSelection() self.drawCanvas(canvas) def createNewPeak(self, a, b, n): position = self.findPosition(a, b, n) activeViews = self.getActiveSpectrumViews() for view in activeViews: spectrum = view.dataSource peakList = Util.getSpectrumActivePeakList(spectrum) if (not peakList): continue (spectrum_position, spectrum_tile) = self.determinePosition(view, position) #print 'createNewPeak', position, spectrum_position, spectrum_tile addPeak(peakList, position=spectrum_position, tile=spectrum_tile, parent=self.parent) def examineRegion(self, canvas, a0, b0, a1, b1, x0, y0, x1, y1, state=no_key_state): # TBD: do more #print 'examineRegion1', a0, b0, a1, b1, x0, y0, x1, y1 if (self.hasValueAxis): return (row, col) = self.scrolled_window.getCanvasRowCol(canvas) region = self.findRegion(min(a0,a1), min(b0,b1), max(a0,a1), max(b0,b1), n=col) #print 'examineRegion2', region if (state == shift_key_state): # TBD: check more, i.e. not just peaks views = self.getActiveSpectrumViews() for view in views: spectrum = view.dataSource spectrum_region = spectrum.numDim * [0] for axisMapping in view.axisMappings: dim = axisMapping.dataDim.dim - 1 label = axisMapping.label spectrum_region[dim] = region[label] peakList = Util.getSpectrumActivePeakList(spectrum) if (peakList): winPeakList = view.findFirstWindowPeakList(peakList=peakList) if (winPeakList and winPeakList.isSymbolDrawn): peakLists = [ peakList ] searchPeaks(peakLists, region=spectrum_region, parent=self.parent) elif (state == (shift_key_state + ctrl_key_state)): params = getPeakFindParams(self.window.project) thickness = params['thickness'] views = self.getActiveSpectrumViews() for view in views: spectrum = view.dataSource spectrum_region = spectrum.numDim * [0] spectrum_thickness = spectrum.numDim * [0] peakList = Util.getSpectrumActivePeakList(spectrum) if (not peakList): continue winPeakList = view.findFirstWindowPeakList(peakList=peakList) if (not winPeakList): continue if not winPeakList.isSymbolDrawn: continue for axisMapping in view.axisMappings: dim = axisMapping.dataDim.dim - 1 label = axisMapping.label if (label in ('x', 'y')): t = 0 else: t = thickness spectrum_region[dim] = region[label] spectrum_thickness[dim] = t findPeaks(peakList, region=spectrum_region, parent=self.parent, thickness=spectrum_thickness) # TBD: why was below here? #canvas.handler.mapRanges(x0, y0, x1, y1, a0, b0, a1, b1) # TBD: below might not be needed now because parent redraws all # but clearXor seems necessary so leave both for now #self.drawCanvas(canvas) canvas.handler.clearXor() def selectMulti(self, canvas, a0, b0, a1, b1, x0, y0, x1, y1, button = 1, state = no_key_state): if (self.hasValueAxis): return self.parent.startSelection() if ((x0 == x1) and (y0 == y1)): self.selectSingle(canvas, a0, b0, x0, y0, newSelection=False) else: self.examineRegion(canvas, a0, b0, a1, b1, x0, y0, x1, y1, state=state) self.parent.endSelection(redraw=True) self.drawCanvas(canvas) def dragBox(self, canvas, a0, b0, a1, b1, x0, y0, x1, y1, button = 1, state = no_key_state): if (self.hasValueAxis): return #print 'dragBox', a0, b0, a1, b1, x0, y0, x1, y1 canvas.handler.makeCurrent() canvas.handler.mapRanges(x0, y0, x1, y1, a0, b0, a1, b1) # TBD: more general color color = (0.0, 0.0, 1.0) canvas.handler.setColor(color) canvas.handler.drawXorBox(a0, b0, a1, b1) # TBD: checks in "changed" functions below are not very clever # (or very useful) but at some point something better could perhaps be done def changedSpectrum(self, spectrum): if isSpectrumInWindow(self.window, spectrum): self.drawAll() def changedPeakList(self, peakList): if isSpectrumInWindow(self.window, peakList.dataSource): self.drawAll() def changedWinPeakList(self, winPeakList): if (self.window == winPeakList.spectrumWindowView.spectrumWindow): self.setPeaksSelector() self.drawAll() def changedPeak(self, peak): if isSpectrumInWindow(self.window, peak.peakList.dataSource): self.drawAll() def changedPeakDim(self, peakDim): if isSpectrumInWindow(self.window, peakDim.peak.peakList.dataSource): self.drawAll() def changedMark(self, *markOrMarkDim): #self.after_idle(self.drawAll) self.drawAll() def changedRuler(self, *ruler): #self.after_idle(self.drawAll) self.drawAll() def changedAppData(self, appData): if (appData.application != self.window.project.application.name): return keyword = appData.keyword if (keyword not in ('maxMarks', 'maxRulers', 'contourScale', 'contourLevel', 'posContourColor', 'negContourColor', 'sliceColor', 'isSpectrumBoxShown', 'color', 'symbol', 'order', 'peakDrawMethod', 'peakPixelSize', 'peakIntensityScale', 'peakVolumeScale')): return if (keyword == 'order'): self.setSpectrumSelector() return if (keyword == 'maxMarks'): removeMarks(self.window.project) elif (keyword == 'maxRulers'): removeRulers(self.window.project) self.drawAll() def changedReferencing(self, *extra): self.setMinThickness() self.updateOrthogonalWorlds() self.drawAll() def changedColor(self, *color): self.setHandlerBackground() #self.after_idle(self.drawAll) self.drawAll() def setViewWindowNames(self): self.setSpectrumSelector() for view in self.window.spectrumWindowViews: self.setViewWindowName(view) def setViewWindowName(self, spectrumWindowView): # this set only so that deletion has something to check if (spectrumWindowView.spectrumWindow == self.window): spectrumWindowView.window_name = self.window.name def initSpectrumWindowView(self, spectrumWindowView): if (not spectrumWindowView.spectrumWindow == self.window): return self.setViewWindowName(spectrumWindowView) self.after_idle(self.setMinThickness) self.after_idle(lambda spectrumWindowView=spectrumWindowView: \ self.changedSpectrumWindowView(spectrumWindowView)) self.after_idle(self.updateOrthogonalWorlds) def setMinThickness(self): for axisPanel in self.window.axisPanels[2:]: if (hasattr(axisPanel, 'region_selector')): min_thickness = self.minAxisPanelThickness(axisPanel) axisPanel.region_selector.setMinThickness(min_thickness) def deleteSpectrumWindowView(self, spectrumWindowView): #print 'WindowPopup1: deleteSpectrumWindowView', self.window.name, self.window.spectrumWindowViews, spectrumWindowView # links of spectrumWindowView cut when deleted so use window_name if hasattr(spectrumWindowView, 'window_name') and (spectrumWindowView.window_name == self.window.name): #print 'WindowPopup3: deleteSpectrumWindowView', self.window.name # check that window itself not being deleted # TBD: change when API code is changed to drop first condition if (not hasattr(self.window, 'deleted') or not self.window.deleted): #print 'WindowPopup4: deleteSpectrumWindowView', self.window.name self.after_idle(self.drawAll) self.after_idle(self.setMinThickness) #print 'WindowPopup2: deleteSpectrumWindowView', self.window.name def changedSpectrumWindowView(self, spectrumWindowView): if (spectrumWindowView.spectrumWindow == self.window): self.drawAll() def changedSpectrumWindowViewSlice(self, spectrumWindowView): if (spectrumWindowView.spectrumWindow == self.window): self.drawAllSlices() def changedBackgroundColor(self, window): if (window != self.window): return self.setHandlerBackground() self.drawAll() def changedAxisTypeRegion(self, *axisType): world_region = self.getWorldRegion() xview_regions = self.getXviewRegions(world_region.x_region) yview_regions = self.getYviewRegions(world_region.y_region) self.scrolled_window.setWorldRegion(world_region, xview_regions, yview_regions) self.drawAll() def changedViewRegion(self, axisRegion): # TBD: not sure if below is good enough panel = axisRegion.axisPanel #print 'changedViewRegion', panel.label, axisRegion.region, panel.spectrumWindow.name, self.window.name if (panel.spectrumWindow == self.window): world_region = self.getWorldRegion() #print 'changedViewRegion0', self.window.name, axisRegion.region view_region = Util.checkSwapRegion(axisRegion.region, panel.axisUnit) #print 'changedViewRegion1', self.window.name, view_region, axisRegion.region axisRegions = list(panel.axisRegions) n = axisRegions.index(axisRegion) #print 'changedViewRegion2', self.window.name, n, panel.label if (panel.label == 'x'): Util.fitViewInWorld(view_region, world_region.x_region) #self.scrolled_window.setXviewRegion(view_region, n) (a0, a1) = view_region self.scrolled_window.setXviewRegion(Region1D(a0, a1), n) self.drawCol(n) else: Util.fitViewInWorld(view_region, world_region.y_region) #self.scrolled_window.setYviewRegion(view_region, n) (b0, b1) = view_region self.scrolled_window.setYviewRegion(Region1D(b0, b1), n) self.drawRow(n) def changedAxisSize(self, axisRegion): panel = axisRegion.axisPanel label = panel.label if (label not in ('x', 'y')): return (w, h, x, y) = self.getGeometry() size = axisRegion.size if (panel.spectrumWindow == self.window): if (label == 'x'): col = list(panel.axisRegions).index(axisRegion) ww = self.scrolled_window.canvases[0][col].winfo_width() #self.scrolled_window.zeroColWeights(col=col) #self.scrolled_window.gridAll(col=col) #self.scrolled_window.zeroWeights(col=col) #self.setGeometry(w+size-ww, h, x, y) #for j in range(self.scrolled_window.nrows): # self.scrolled_window.canvases[j][col].config(width=size) #self.scrolled_window.canvases[0][col].config(width=size) #self.after_idle(self.scrolled_window.oneColWeights) #self.after_idle(self.scrolled_window.gridAll) #print 'changedAxisSize1', list(panel.axisRegions).index(axisRegion), w, ww, size, w+size-ww elif (label == 'y'): row = list(panel.axisRegions).index(axisRegion) hh = self.scrolled_window.canvases[row][0].winfo_height() #self.scrolled_window.zeroRowWeights(row=row) #self.scrolled_window.gridAll(row=row) #self.scrolled_window.zeroWeights(row=row) #self.setGeometry(w, h+size-hh, x, y) #for i in range(self.scrolled_window.ncols): # self.scrolled_window.canvases[row][i].config(height=size) #self.scrolled_window.canvases[row][0].config(height=size) #self.after_idle(self.scrolled_window.oneRowWeights) #self.after_idle(self.scrolled_window.gridAll) #print 'changedAxisSize2', list(panel.axisRegions).index(axisRegion), h, hh, size, h+size-hh #self.drawAll() def changedOrthogonalRegion(self, axisRegion): #print 'changedOrthogonalRegion' axisPanel = axisRegion.axisPanel if (axisPanel.spectrumWindow == self.window): self.drawAll() axisRegions = list(axisPanel.axisRegions) n = axisRegions.index(axisRegion) # check if corresponding x axis region is active, if so change selector if len(axisRegions) == 1: self.window.axisPanels[0].axisRegions[n].isActive = True if (self.window.axisPanels[0].axisRegions[n].isActive): (r0, r1) = Util.checkSwapRegion(axisRegion.region, axisPanel.axisUnit) axisPanel.region_selector.setViewRegion(r0, r1, do_callback=True) def changedAxisRegion(self, axisRegion): axisPanel = axisRegion.axisPanel #print 'WindowPopup.changedAxisRegion', axisPanel.label, axisRegion.region, list(axisPanel.axisRegions).index(axisRegion) if (axisPanel.spectrumWindow != self.window): return if (axisPanel.label in ('x', 'y')): self.changedViewRegion(axisRegion) else: self.changedOrthogonalRegion(axisRegion) # some axisRegion has been created or deleted def changedAxisRegions(self, axisRegion): axisPanel = axisRegion.axisPanel window = axisPanel.spectrumWindow if (window != self.window): return self.setStripsSelectorAfter() if (axisPanel.label in ('x', 'y')): return def changedPanelVisibility(self, panel): if (panel.spectrumWindow == self.window): if (panel.label in ('x', 'y')): #print 'changedPanel', panel.label if (panel.label == 'x'): self.scrolled_window.setIsShownXScrollbar(panel.isVisible) else: # (panel.label == 'y') self.scrolled_window.setIsShownYScrollbar(panel.isVisible) else: self.gridAll() def changedSliceVisibility(self, panel): if (panel.spectrumWindow == self.window): if (panel.label == 'x'): self.scrolled_window.setIsShownXSlice(panel.isVisible) elif (panel.label == 'y'): self.scrolled_window.setIsShownYSlice(panel.isVisible) else: self.gridAll() if (panel.isVisible): self.drawAllSlices() def changedSliceThickness(self, panel): if (panel.spectrumWindow == self.window): if (panel.label == 'x'): t = Util.greaterOrEqualEntry(panel.thickness, slice_height_entries) self.scrolled_window.setSizeXSlice(t) elif (panel.label == 'y'): t = Util.greaterOrEqualEntry(panel.thickness, slice_height_entries) self.scrolled_window.setSizeYSlice(t) #draw automatically happens if (panel.isVisible): self.drawAllSlices() def minAxisPanelThickness(self, axisPanel): label = axisPanel.label unit = axisPanel.axisUnit.unit min_thickness = None for view in self.window.spectrumWindowViews: axisMapping = view.findFirstAxisMapping(label=label) if (axisMapping): t = Util.convertPosition(1.0, axisMapping.dataDim.dataDimRefs[0], toUnit=unit, relative=True) t = abs(t) if min_thickness is None: min_thickness = t else: min_thickness = min(min_thickness, t) return min_thickness def getOrthogonalWorldRegion(self, axisPanel): # TBD: some assumptions in here that working with ppm... axisType = axisPanel.axisType label = axisPanel.label possViews = self.window.spectrumWindowViews views = [] # try to protect against deleted or messed up views for view in possViews: if not view.isDeleted: try: axisMapping = view.findFirstAxisMapping(label=label) if axisMapping: views.append(view) except: pass if not views: # if no views just use the default axisType world region region = Util.checkSwapRegion(axisType.region, axisType.axisUnits[0]) return region r0 = None r1 = None for view in views: axisMapping = view.findFirstAxisMapping(label=label) dataDim = axisMapping.dataDim dataDimRef = dataDim.dataDimRefs[0] expDimRef = dataDimRef.expDimRef minAliasedFreq = expDimRef.minAliasedFreq if minAliasedFreq is None: minAliasedFreq = Util.convertPosition(float(dataDim.numPoints), dataDimRef, toUnit=axisType.axisUnits[0].unit) if r0 is None: r0 = minAliasedFreq else: r0 = min(r0, minAliasedFreq) maxAliasedFreq = expDimRef.maxAliasedFreq if maxAliasedFreq is None: maxAliasedFreq = Util.convertPosition(1.0, dataDimRef, toUnit=axisType.axisUnits[0].unit) if r1 is None: r1 = maxAliasedFreq else: r1 = max(r1, maxAliasedFreq) (r0, r1) = Util.checkSwapRegion((r0, r1), axisType.axisUnits[0]) return Region1D(r0, r1) def updateOrthogonalWorlds(self): for axisPanel in self.window.axisPanels[2:]: world_region = self.getOrthogonalWorldRegion(axisPanel) axisPanel.region_selector.setWorldRegion(world_region) def createRegionSelector(self, axisPanel): if (axisPanel.spectrumWindow != self.window): return self.deleteRegionSelector(axisPanel) master = self.widget_parent axisType = axisPanel.axisType label = axisType.name callback = lambda view_region, axisPanel=axisPanel: \ self.regionSelectorCallback(view_region, axisPanel) #(r0, r1) = Util.checkSwapRegion(axisType.region, axisType.axisUnits[0]) #world_region = Region1D(r0, r1) (w0, w1) = world_region = self.getOrthogonalWorldRegion(axisPanel) (v0, v1) = Util.checkSwapRegion(axisPanel.axisRegions[0].region, axisPanel.axisUnit) if (w0 < w1): if v0 < w0: d = v1 - v0 v0 = w0 v1 = min(v0+d, w1) elif v1 > w1: d = v1 - v0 v1 = w1 v0 = max(v1-d, w0) else: if v0 > w0: d = v1 - v0 v0 = w0 v1 = max(v0+d, w1) elif v1 < w1: d = v1 - v0 v1 = w1 v0 = min(v1-d, w0) view_region = Region1D(v0, v1) min_thickness = self.minAxisPanelThickness(axisPanel) #print 'createRegionSelector', label, world_region, view_region axisPanel.region_selector = RegionSelector(master, label=label, callback=callback, text_decimals=axisType.numDecimals, world_region=world_region, view_region=view_region, min_thickness=min_thickness) def deleteRegionSelector(self, axisPanel): if (hasattr(axisPanel, 'region_selector')): axisPanel.region_selector.destroy() del axisPanel.region_selector def createSliceCanvas(self, slicePanel): if (slicePanel.spectrumWindow != self.window): return self.deleteSliceCanvas(slicePanel) # TBD: more def deleteSliceCanvas(self, slicePanel): if (hasattr(slicePanel, 'slice_canvas')): slicePanel.slice_canvas.destroy() del slicePanel.slice_canvas def gridAll(self): row = 1 #self.scrolledFrame.grid(row=row, column=0, sticky=Tkinter.EW) row = row + 1 self.scrolled_window.grid(row=row, column=0, sticky=Tkinter.NSEW) row = row + 1 for axisPanel in self.window.axisPanels[2:]: if (axisPanel.isVisible): axisPanel.region_selector.grid(row=row, column=0, sticky=Tkinter.EW) row = row + 1 else: axisPanel.region_selector.grid_forget() # TBD: uncomment this (after modifying) #for slicePanel in self.window.slicePanels[2:]: # if (slicePanel.isVisible): # slicePanel.region_selector.grid(row=row, column=0, sticky=Tkinter.EW) # row = row + 1 # else: # slicePanel.region_selector.grid_forget() def regionSelectorCallback(self, view_region, axisPanel): if (not hasattr(axisPanel, 'region_selector')): return #print 'regionSelectorCallback1', view_region view_region = Util.checkSwapRegion(view_region, axisPanel.axisUnit) #print 'regionSelectorCallback2', view_region axisRegions = axisPanel.axisRegions xaxisRegions = self.window.axisPanels[0].axisRegions if len(xaxisRegions) == 1: xaxisRegions[0].isActive = True for n in range(len(xaxisRegions)): if (xaxisRegions[n].isActive): try: axisRegions[n].region = view_region except: pass # can fail when orthogonal axis being created #self.drawAll() def destroy(self): Implementation.unregisterNotify(self.setWindowTitle, 'ccpnmr.Analysis.SpectrumWindow', 'setName') Implementation.unregisterNotify(self.setWindowLocation, 'ccpnmr.Analysis.SpectrumWindow', 'setLocation') Implementation.unregisterNotify(self.changedAxisTypeRegion, 'ccpnmr.Analysis.AxisType', 'setRegion') Implementation.unregisterNotify(self.drawAll, 'ccpnmr.Analysis.AxisType', 'setPeakSize') Implementation.unregisterNotify(self.changedBackgroundColor, 'ccpnmr.Analysis.SpectrumWindow', 'setBackground') Implementation.unregisterNotify(self.changedAspectRatio, 'ccpnmr.Analysis.SpectrumWindow', 'setAspectRatio') Implementation.unregisterNotify(self.changedSliceRange, 'ccpnmr.Analysis.SpectrumWindow', 'setSliceRange') Implementation.unregisterNotify(self.changedIsIconified, 'ccpnmr.Analysis.SpectrumWindow', 'setIsIconified') Implementation.unregisterNotify(self.changedAxisRegion, 'ccpnmr.Analysis.AxisRegion', 'setRegion') Implementation.unregisterNotify(self.setStripsSelectorAfter, 'ccpnmr.Analysis.AxisRegion', 'setIsActive') for func in ('__init__', 'delete'): Implementation.unregisterNotify(self.changedAxisRegions, 'ccpnmr.Analysis.AxisRegion', func) Implementation.unregisterNotify(self.changedAxisSize, 'ccpnmr.Analysis.AxisRegion', 'setSize') Implementation.unregisterNotify(self.initSpectrumWindowView, 'ccpnmr.Analysis.SpectrumWindowView', '__init__') Implementation.unregisterNotify(self.setSpectrumSelector, 'ccpnmr.Analysis.SpectrumWindowView', 'setIsInToolbar') Implementation.unregisterNotify(self.changedSpectrumWindowView, 'ccpnmr.Analysis.SpectrumWindowView', 'setIsPosVisible') Implementation.unregisterNotify(self.changedSpectrumWindowView, 'ccpnmr.Analysis.SpectrumWindowView', 'setIsNegVisible') Implementation.unregisterNotify(self.changedSpectrumWindowViewSlice, 'ccpnmr.Analysis.SpectrumWindowView', 'setIsSliceVisible') Implementation.unregisterNotify(self.deleteSpectrumWindowView, 'ccpnmr.Analysis.SpectrumWindowView', 'delete') Implementation.unregisterNotify(self.changedPanelVisibility, 'ccpnmr.Analysis.AxisPanel', 'setIsVisible') Implementation.unregisterNotify(self.initAxisPanel, 'ccpnmr.Analysis.AxisPanel', '__init__') Implementation.unregisterNotify(self.deleteAxisPanel, 'ccpnmr.Analysis.AxisPanel', 'delete') Implementation.unregisterNotify(self.createSliceCanvas, 'ccpnmr.Analysis.SlicePanel', '__init__') Implementation.unregisterNotify(self.changedSliceVisibility, 'ccpnmr.Analysis.SlicePanel', 'setIsVisible') Implementation.unregisterNotify(self.changedSliceThickness, 'ccpnmr.Analysis.SlicePanel', 'setThickness') Implementation.unregisterNotify(self.changedSpectrum, 'ccp.Nmr.DataSource', 'setScale') Implementation.unregisterNotify(self.setSpectrumSelector, 'ccp.Nmr.DataSource', 'setName') Implementation.unregisterNotify(self.setSpectrumSelector, 'ccp.Nmr.Experiment', 'setName') Implementation.unregisterNotify(self.changedPeakList, 'ccp.Nmr.PeakList', 'setPeakColor') Implementation.unregisterNotify(self.changedPeakList, 'ccp.Nmr.PeakList', 'setPeakSymbol') Implementation.unregisterNotify(self.setPeaksSelector, 'ccpnmr.Analysis.WindowPeakList', '__init__') Implementation.unregisterNotify(self.setPeaksSelector, 'ccpnmr.Analysis.WindowPeakList', 'delete') Implementation.unregisterNotify(self.changedWinPeakList, 'ccpnmr.Analysis.WindowPeakList', 'setIsSymbolDrawn') Implementation.unregisterNotify(self.changedWinPeakList, 'ccpnmr.Analysis.WindowPeakList', 'setIsAnnotationDrawn') Implementation.unregisterNotify(self.initPeak, 'ccp.Nmr.Peak', '__init__') Implementation.unregisterNotify(self.deletePeak, 'ccp.Nmr.Peak', 'delete') Implementation.unregisterNotify(self.changedPeak, 'ccp.Nmr.Peak', 'setAnnotation') Implementation.unregisterNotify(self.changedPeakDim, 'ccp.Nmr.PeakDim', 'setPosition') Implementation.unregisterNotify(self.changedPeakDim, 'ccp.Nmr.PeakDim', 'setAnnotation') Implementation.unregisterNotify(self.changedMark, 'ccpnmr.Analysis.Mark', '') Implementation.unregisterNotify(self.changedMark, 'ccpnmr.Analysis.MarkDim', '') Implementation.unregisterNotify(self.changedMark, 'ccpnmr.Analysis.MarkDim', '__init__') Implementation.unregisterNotify(self.changedMark, 'ccpnmr.Analysis.MarkDim', 'delete') Implementation.unregisterNotify(self.changedRuler, 'ccpnmr.Analysis.Ruler', '') Implementation.unregisterNotify(self.changedRuler, 'ccpnmr.Analysis.Ruler', '__init__') Implementation.unregisterNotify(self.changedRuler, 'ccpnmr.Analysis.Ruler', 'delete') Implementation.unregisterNotify(self.changedColor, 'ccpnmr.Analysis.Color', 'setR') Implementation.unregisterNotify(self.changedColor, 'ccpnmr.Analysis.Color', 'setG') Implementation.unregisterNotify(self.changedColor, 'ccpnmr.Analysis.Color', 'setB') Implementation.unregisterNotify(self.changedColor, 'ccpnmr.Analysis.ColorScheme', 'setColorNames') Implementation.unregisterNotify(self.changedReferencing, 'ccp.Nmr.ExpDimRef', '') Implementation.unregisterNotify(self.changedReferencing, 'ccp.Nmr.DataDimRef', '') Implementation.unregisterNotify(self.changedReferencing, 'ccp.Nmr.FreqDataDim', '') for func in ('__init__', 'delete', 'setValue'): for t in ('Int', 'Float', 'String', 'Boolean'): clazz = 'memops.Implementation.AppData' + t Implementation.unregisterNotify(self.changedAppData, clazz, func) self.deleteHandlers() BasePopup.destroy(self) def setWindowTitle(self, window = None): if ((window == None) or (window == self.window)): self.setTitle(self.window.name) def setWindowLocation(self, window): if (window == self.window): #print 'setWindowLocation1', self.geometry(), window.location location = '+%s+%s' % (window.location[0], window.location[1]) self.geometry(location) #print 'setWindowLocation2', self.geometry() def getWindowLocation(self, *event): location = self.geometry() self.drawAll() #print 'getWindowLocation1', location # below only so that geometry manager does not resize without being told to #w = int(location.split('x')[0]) #if ((w > 1) and self.firstPass): # self.geometry(location) # self.firstPass = False # TBD: below supposedly does not give location on all platforms # (when called because of binding to 'Configure') n = location.find('+') xy = location[n+1:] (x, y) = map(int, xy.split('+')) #print 'getWindowLocation2', (x, y) if not self.window.isDeleted: Implementation.unregisterNotify(self.setWindowLocation, 'ccpnmr.Analysis.SpectrumWindow', 'setLocation') self.window.location = (x, y) Implementation.registerNotify(self.setWindowLocation, 'ccpnmr.Analysis.SpectrumWindow', 'setLocation') # the above would have in turn called setWindowLocation() if (x, y) had changed # but there is no point in doing that and can cause windows to judder back to previous location def setupWidgetHandler(self, widget, isCanvas = True): if (not hasattr(widget, 'handler')): #print 'setupWidgetHandler' widget.handler = self.handlerClass(widget) if (isCanvas): (j, i) = self.scrolled_window.getCanvasRowCol(widget) widget.xview = self.window.axisPanels[0].axisRegions[i] widget.yview = self.window.axisPanels[1].axisRegions[j] self.setWidgetHandlerBackground(widget) def setHandlers(self): for j in range(self.scrolled_window.nrows): for i in range(self.scrolled_window.ncols): canvas = self.scrolled_window.canvases[j][i] canvas.handler = self.handlerClass(canvas) canvas.xview = self.window.axisPanels[0].axisRegions[i] canvas.yview = self.window.axisPanels[1].axisRegions[j] if (self.hasValueAxis): return for i in range(self.scrolled_window.ncols): slice = self.scrolled_window.xslices[i] slice.handler = self.handlerClass(slice) for j in range(self.scrolled_window.nrows): slice = self.scrolled_window.yslices[j] slice.handler = self.handlerClass(slice) def deleteHandlers(self): # force C world clean-up #print 'deleteHandlers' #for j in range(self.scrolled_window.nrows): # for i in range(self.scrolled_window.ncols): # canvas = self.scrolled_window.canvases[j][i] # canvas.handler = None #print 'deleteHandlers' for j in range(self.scrolled_window.nrows): if j >= len(self.scrolled_window.canvases): print "Cleanup called on non-existant canvases" continue for i in range(self.scrolled_window.ncols): if i >= len(self.scrolled_window.canvases[j]): print "Cleanup called on non-existant canvases" continue canvas = self.scrolled_window.canvases[j][i] canvas.handler = None if (self.hasValueAxis): return for i in range(self.scrolled_window.ncols): slice = self.scrolled_window.xslices[i] slice.handler = None for j in range(self.scrolled_window.nrows): slice = self.scrolled_window.yslices[j] slice.handler = None def setHandlersRow(self, row): for i in range(self.scrolled_window.ncols): canvas = self.scrolled_window.canvases[row][i] canvas.handler = self.handlerClass(canvas) canvas.xview = self.window.axisPanels[0].axisRegions[i] canvas.yview = self.window.axisPanels[1].axisRegions[row] if (self.hasValueAxis): return slice = self.scrolled_window.yslices[row] slice.handler = self.handlerClass(slice) def setHandlersCol(self, col = -1): #print 'setHandlersCol', col for j in range(self.scrolled_window.nrows): canvas = self.scrolled_window.canvases[j][col] canvas.handler = self.handlerClass(canvas) canvas.xview = self.window.axisPanels[0].axisRegions[col] canvas.yview = self.window.axisPanels[1].axisRegions[j] if (self.hasValueAxis): return slice = self.scrolled_window.xslices[col] slice.handler = self.handlerClass(slice) def setWidgetHandlerBackground(self, widget): background = self.window.background color = (background.r, background.g, background.b) widget.handler.setBackground(color) def setHandlerBackground(self): background = self.window.background color = (background.r, background.g, background.b) #print 'setHandlerBackground', self.window.name, (background.r, background.g, background.b) self.scrolled_window.setBackground(color) for j in range(self.scrolled_window.nrows): for i in range(self.scrolled_window.ncols): canvas = self.scrolled_window.canvases[j][i] self.setupWidgetHandler(canvas, isCanvas=True) canvas.handler.setBackground(color) if (self.hasValueAxis): return for i in range(self.scrolled_window.ncols): slice = self.scrolled_window.xslices[i] self.setupWidgetHandler(slice, isCanvas=False) slice.handler.setBackground(color) for j in range(self.scrolled_window.nrows): slice = self.scrolled_window.yslices[j] self.setupWidgetHandler(slice, isCanvas=False) slice.handler.setBackground(color) def changedAspectRatio(self, window, doDraw = True): if (window != self.window): return self.updateAspectRatio(doDraw=doDraw) def updateAspectRatio(self, doDraw = True): if (self.hasValueAxis): return for j in range(self.scrolled_window.nrows): self.checkAspectRatio(self.scrolled_window.canvases[j][0]) for i in range(1, self.scrolled_window.ncols): self.checkAspectRatio(self.scrolled_window.canvases[0][i]) if (doDraw): self.drawAll() def changedSliceRange(self, window): if (window != self.window): return self.drawAllSlices() def setMaxExtent(self, canvas): r = self.window.aspectRatio w = float(canvas.canvas_width) h = float(canvas.canvas_height) (x0, x1) = canvas.parent.world_region.x_region (y0, y1) = canvas.parent.world_region.y_region rr = abs(((y1-y0)/h) / ((x1-x0)/w)) if (rr > r): d = y0 + y1 e = r * (x1-x0) * h / w y0 = 0.5 * (d - e) y1 = 0.5 * (d + e) else: d = x0 + x1 e = (y1-y0) * w / (h * r) x0 = 0.5 * (d - e) x1 = 0.5 * (d + e) canvas.xmax_extent = abs(x1-x0) canvas.ymax_extent = abs(y1-y0) #print 'setWorldRegion0', canvas.parent.world_region.x_region, canvas.xmax_extent #print 'setWorldRegion1', canvas.parent.world_region.y_region, canvas.ymax_extent def checkAspectRatio(self, canvas): if (self.hasValueAxis): return True r = self.window.aspectRatio w = float(canvas.canvas_width) h = float(canvas.canvas_height) (x0, x1) = canvas.xview_region (y0, y1) = canvas.yview_region #print 'checkAspectRatio0', x0, x1, y0, y1, w, h, r (row, col) = self.scrolled_window.getCanvasRowCol(canvas) xgroup = self.window.axisPanels[0].axisRegions[col].axisRegionGroup ygroup = self.window.axisPanels[1].axisRegions[row].axisRegionGroup if (xgroup is not None and ygroup is not None): # ignore aspect ratio return #print 'WindowPopup.checkAspectRatio0', row, col, x0, x1, y0, y1, xgroup, ygroup, self.scrolled_window.nrows, self.scrolled_window.ncols if ((not ygroup) and (self.scrolled_window.ncols == 1)): # resize y direction d = y0 + y1 e = r * (x1-x0) * h / w yy0 = 0.5 * (d - e) yy1 = 0.5 * (d + e) if ((yy0 == y0) and (yy1 == y1)): return False #print 'checkAspectRatio1', yy0, yy1, row, col canvas.yview_region.set(yy0, yy1) axisRegion = self.window.axisPanels[1].axisRegions[row] #print 'WindowPopup.checkAspectRatio1', (min(yy0, yy1), max(yy0, yy1)) axisRegion.region = (min(yy0, yy1), max(yy0, yy1)) else: # resize x direction d = x0 + x1 e = (y1-y0) * w / (r * h) xx0 = 0.5 * (d - e) xx1 = 0.5 * (d + e) if ((xx0 == x0) and (xx1 == x1)): return False #print 'checkAspectRatio2', xx0, xx1, row, col canvas.xview_region.set(xx0, xx1) axisRegion = self.window.axisPanels[0].axisRegions[col] #print 'WindowPopup.checkAspectRatio2', (min(xx0, xx1), max(xx0, xx1)) axisRegion.region = (min(xx0, xx1), max(xx0, xx1)) self.setMaxExtent(canvas) # not sure why after_idle required but otherwise get blank #canvas.after_idle(lambda self=self, canvas=canvas: self.scrolled_window.updateView(canvas)) self.scrolled_window.updateView(canvas) return True def focusIn(self, event): if (self != event.widget): return #print 'focusIn', self.window.name #self.scrolled_window.oneWeights() def resize(self, event): #if self.waitResize: # return #print 'in resize', self.window.name canvas = event.widget width = event.width height = event.height (row, col) = self.scrolled_window.getCanvasRowCol(canvas) #print 'resize', row, col, width, height, canvas.winfo_width(), canvas.winfo_height() self.window.axisPanels[0].axisRegions[col].size = width self.window.axisPanels[1].axisRegions[row].size = height self.setupWidgetHandler(canvas, isCanvas=True) canvas.canvas_width = width canvas.canvas_height = height canvas.handler.resize(width, height) redrawn = self.checkAspectRatio(canvas) if (not redrawn): # not sure why after_idle required but otherwise get blank #canvas.after_idle(lambda self=self, canvas=canvas: self.drawCanvas(canvas)) self.drawCanvas(canvas) def expose(self, event): #print 'in expose', self.window.name canvas = event.widget self.drawCanvas(canvas) def showMotion(self, x, y, canvas = None): self.window.axisPanels[0].pointLocation = x self.window.axisPanels[1].pointLocation = y for axisPanel in self.window.axisPanels[2:]: if (canvas): (row, col) = self.scrolled_window.getCanvasRowCol(canvas) axisRegion = axisPanel.axisRegions[col] axisPanel.pointLocation = self.calcAxisMidpoint(axisRegion) else: axisPanel.pointLocation = None self.setLocationLabel(x, y) n = len(self.window.axisPanels) typeLocation = n * [0] typeLocation = [ (axisPanel.panelType, axisPanel.pointLocation) for axisPanel in self.window.axisPanels ] self.parent.drawCrosshair(typeLocation) def motion(self, event): canvas = event.widget w = canvas.canvas_width h = canvas.canvas_height x = event.x y = h - 1 - event.y (x0, x1) = canvas.xview_region (y0, y1) = canvas.yview_region r = (x + 0.5) / w s = (y + 0.5) / h x = x0 * (1 - r) + x1 * r y = y0 * (1 - s) + y1 * s self.showMotion(x, y, canvas) if (not self.hasValueAxis): self.drawAllSlices() def setLocationLabel(self, x = None, y = None): nonetext = 'undef' if (x is None): xtext = nonetext else: xdecimals = self.window.axisPanels[0].axisType.numDecimals xtext = formatDecimals(x, decimals=xdecimals) if (y is None): ytext = nonetext else: ydecimals = self.window.axisPanels[1].axisType.numDecimals ytext = formatDecimals(y, decimals=ydecimals) text = '%6s, %6s' % (xtext,ytext) self.location_label.set(text) def drawCanvasCrosshair(self, canvas, x, y): if (self.scrolled_window.isDeleting): return (x0, x1) = canvas.xview_region (y0, y1) = canvas.yview_region self.setupWidgetHandler(canvas, isCanvas=True) handler = canvas.handler handler.makeCurrent() handler.mapRanges(0, 0, 1, 1, 0, 0, 1, 1) handler.startXor() handler.setColor(self.handlerXorColor) # above in xor mode means that below will appear in inverse colors if (x is not None): x = float(x - x0) / (x1 - x0) handler.drawLine(x, 0, x, 1) if (y is not None): y = float(y - y0) / (y1 - y0) handler.drawLine(0, y, 1, y) handler.finishXor() def drawCrosshair(self, typeLocation): if (self.scrolled_window.isDeleting): return if (self.state() != 'normal'): return x = None y = None for n in range(2): axisPanel = self.window.axisPanels[n] for (panelType, pointLocation) in typeLocation: if (panelType is axisPanel.panelType): if (n == 0): if (pointLocation is None): x = None else: x = float(pointLocation) else: if (pointLocation is None): y = None else: y = float(pointLocation) self.setLocationLabel(x, y) if (x is None and y is None): return for j in range(self.scrolled_window.nrows): for i in range(self.scrolled_window.ncols): self.drawCanvasCrosshair(self.scrolled_window.canvases[j][i], x, y) if (x is not None): for i in range(self.scrolled_window.ncols): ticks = self.scrolled_window.xticks[i] ticks.drawCrosshair(x) if (y is not None): for j in range(self.scrolled_window.nrows): ticks = self.scrolled_window.yticks[j] ticks.drawCrosshair(y) def leave(self, event): for i in range(2): self.window.axisPanels[i].pointLocation = None self.parent.endCrosshair() def endCanvasCrosshair(self, canvas): if (self.scrolled_window.isDeleting): return self.setupWidgetHandler(canvas, isCanvas=True) handler = canvas.handler handler.makeCurrent() handler.clearXor() def endSliceCrosshair(self, slice): if (self.scrolled_window.isDeleting): return self.setupWidgetHandler(slice, isCanvas=False) handler = slice.handler handler.makeCurrent() handler.clearXor() def endCrosshair(self): if (self.scrolled_window.isDeleting): return if (self.state() != 'normal'): return for j in range(self.scrolled_window.nrows): for i in range(self.scrolled_window.ncols): self.endCanvasCrosshair(self.scrolled_window.canvases[j][i]) for i in range(self.scrolled_window.ncols): ticks = self.scrolled_window.xticks[i] ticks.clearCrosshair() for j in range(self.scrolled_window.nrows): ticks = self.scrolled_window.yticks[j] ticks.clearCrosshair() if (self.hasValueAxis): return for i in range(self.scrolled_window.ncols): self.endSliceCrosshair(self.scrolled_window.xslices[i]) for j in range(self.scrolled_window.nrows): self.endSliceCrosshair(self.scrolled_window.yslices[j]) def sliceResize(self, event): #print 'in sliceResize' slice = event.widget width = event.width height = event.height self.setupWidgetHandler(slice, isCanvas=False) slice.slice_width = width slice.slice_height = height slice.handler.resize(width, height) def sliceExpose(self, event): #print 'in sliceExpose' slice = event.widget self.drawSlice(slice) def sliceMotion(self, event): slice = event.widget if (slice.orient == Tkinter.HORIZONTAL): w = slice.slice_width x = event.x (x0, x1) = slice.view_region r = (x + 0.5) / w x = x0 * (1 - r) + x1 * r y = None else: h = slice.slice_height y = h - 1 - event.y (y0, y1) = slice.view_region s = (y + 0.5) / h y = y0 * (1 - s) + y1 * s x = None self.showMotion(x, y) #self.drawSliceCrosshair(slice, x=x, y=y) self.drawAllSlices() def viewSet(self, canvas, xview_region, yview_region): #print 'viewSet1', self.window.name, xview_region[0], xview_region[1], yview_region[0], yview_region[1] # first time viewSet called setHandlers has not yet been called so xview, yview not set if (hasattr(canvas, 'xview')): #print 'viewSet2', self.window.name axisUnit = canvas.xview.axisPanel.axisType.axisUnits[0] canvas.xview.region = Util.checkSwapRegion(xview_region, axisUnit) #print 'viewSet3', canvas.xview.region[0], canvas.xview.region[1] axisUnit = canvas.yview.axisPanel.axisType.axisUnits[0] canvas.yview.region = Util.checkSwapRegion(yview_region, axisUnit) #print 'viewSet4', canvas.yview.region[0], canvas.yview.region[1] else: pass # TBD: anything one should do? #print 'viewSet5', self.window.name #print 'viewSet6', self.window.name # TBD: is this needed, and when? #self.drawCanvas(canvas) #print 'viewSet7', self.window.name def doCreateHorizontalRuler(self, canvas, x, y): (a, b, x, y) = self.scrolled_window.calcWorldCoord(canvas, x, y) createRuler(b, self.window.axisPanels[1].panelType) #print 'doCreateHorizontalRuler', len(self.window.root.rulers) def doCreateVerticalRuler(self, canvas, x, y): (a, b, x, y) = self.scrolled_window.calcWorldCoord(canvas, x, y) createRuler(a, self.window.axisPanels[0].panelType) def doCreateMark(self, canvas, x, y): (row, col) = self.scrolled_window.getCanvasRowCol(canvas) xAxisRegion = self.window.axisPanels[0].axisRegions[col] yAxisRegion = self.window.axisPanels[1].axisRegions[row] (a, b, x, y) = self.scrolled_window.calcWorldCoord(canvas, x, y) position_region = self.findPositionRegion(a, b, col) views = self.getActiveSpectrumViews() peak = None if (self.hasValueAxis): # TBD: look for nearby peaks pass else: for view in views: spectrum = view.dataSource (xscale, yscale) = self.getPeakScale(view, xAxisRegion, yAxisRegion) spectrum_region = spectrum.numDim * [0] axisPanels = spectrum.numDim * [0] for axisMapping in view.axisMappings: dataDim = axisMapping.dataDim dim = axisMapping.dim - 1 label = axisMapping.label if (not self.isInAllowedRegion(dataDim, label, position_region[label])): break if (label == 'x'): xdim = dim elif (label == 'y'): ydim = dim axisPanels[dim] = self.window.findFirstAxisPanel(label=label) spectrum_region[dim] = self.convertPositionRegion(position_region[label], axisPanels[dim], dataDim) else: peakList = Util.getSpectrumActivePeakList(spectrum) if (peakList): peak = self.findNearbyPeak(peakList, spectrum_region, xdim, ydim, xscale, yscale) if (peak): break project = self.window.project if (peak): createPeakMark(peak) positions = len(peak.peakDims) * [0] for n in range(len(peak.peakDims)): peakDim = peak.peakDims[n] positions[n] = Util.convertPosition(peakDim.position, peakDim.dataDimRef, toUnit=axisPanels[n].axisUnit.unit) else: positions = self.findPosition(a, b, col, returnDict=False) axisTypes = [axisPanel.axisType for axisPanel in self.window.axisPanels] createNonPeakMark(positions, axisTypes) def moveSelectedPeak(self, canvas, x, y): peaks = self.parent.currentPeaks if (len(peaks) > 1): showError('Multiple peaks', 'Multiple peaks selected, can only move one at a time.') return elif (not len(peaks)): return peak = peaks[0] spectrum = peak.peakList.dataSource view = getSpectrumWindowView(self.window, spectrum) if (not view): showError('Peak not in window', 'Selected peak not in this window.') return (a, b, x, y) = self.scrolled_window.calcWorldCoord(canvas, x, y) (row, col) = self.scrolled_window.getCanvasRowCol(canvas) position = self.findPosition(a, b, col) (spectrum_position, spectrum_tile) = self.determinePosition(view, position) setPeakPosition(peak, spectrum_position, spectrum_tile) def assignPeakAtLocation(self, canvas, x, y): (x, y, propX, propY) = self.scrolled_window.calcWorldCoord(canvas, x, y) (row, col) = self.scrolled_window.getCanvasRowCol(canvas) xAxisRegion = self.window.axisPanels[0].axisRegions[col] yAxisRegion = self.window.axisPanels[1].axisRegions[row] region = self.findPositionRegion(x, y, col) for view in self.getActiveSpectrumViews(): peak = self.findNearbyViewPeak(view, region, xAxisRegion, yAxisRegion) if peak: self.menuPeak = peak self.assignPeak() break def keypress(self, event): keysym = event.keysym #print 'keypress1', keysym if (keysym in Util.spectrum_shortcuts): self.parent.toggleSpectrum(self.window, shortcut=keysym) else: project = self.project macro = project.findFirstMacro(shortcut=keysym) #print 'keypress2', macro if (macro): self.setCurrentObjects(event) Util.runMacro(macro, self.parent.argumentServer) def sliceKeypress(self, event): #print 'sliceKeypress', event.keysym slice = event.widget if (event.keysym == 'Home'): self.changeSliceRange(0.5) elif (event.keysym == 'End'): self.changeSliceRange(2.0) def changeSliceRange(self, scale): if (not self.hasValueAxis): (r0, r1) = self.window.sliceRange a = 0.5 * (r0 + r1) b = 0.5 * scale * (r1 - r0) self.window.sliceRange = (a - b, a + b) else: # TBD: change y axis range pass # overrides WindowDraw version def drawViewTile(self, handler, canvas, view, contourLevels, contourStyle, worldPointRanges, spectrumPointRanges, row): #if (self.window.name == 'w'): # print 'entering drawViewTile', self.window.name if (canvas.doubleBuffer): #print 'drawViewTile double', self.window.name t = time.time() if ((t - canvas.initTime) > doubleBufferTimeout): raise WindowTimeoutException() # exceptions caught higher up self.drawViewTileReal(handler, view, contourLevels, contourStyle, worldPointRanges, spectrumPointRanges, row) else: #print 'drawViewTile single', self.window.name # exceptions caught here because called with after_idle try: #print 'drawViewTile0', self.window.name self.drawViewTileReal(handler, view, contourLevels, contourStyle, worldPointRanges, spectrumPointRanges, row) #print 'drawViewTile1', self.window.name except Implementation.ApiError, e: print 'Drawing canvas tile error:', e.error_msg except self.handlerExc, e: print 'Drawing canvas tile handler error:', e except ContourFile.error, e: print 'Drawing canvas tile ContourFile error:', e except SliceFile.error, e: print 'Drawing canvas tile SliceFile error:', e except PeakList.error, e: print 'Drawing canvas tile PeakList error:', e except WinPeakList.error, e: print 'Drawing canvas tile WinPeakList error:', e except: #print 'Unknown canvas tile error' pass # overrides WindowDraw version def drawCanvas(self, canvas, row = None, col = None): if (self.scrolled_window.isDeleting): return if (self.state() != 'normal'): return # below does not work because get splatted by Tcl/Tk if do nothing #if (hasattr(canvas, 'beingDrawn') and canvas.beingDrawn): # return if (row is None or col is None): (row, col) = self.scrolled_window.getCanvasRowCol(canvas) self.drawCanvasCount = self.drawCanvasCount + 1 #canvas.beingDrawn = True if (not hasattr(canvas, 'drawCount')): canvas.drawCount = 0 ''' if (self.window.name == 'Win_Hn-N'): from Util import printStackTrace fp = open('test.txt', 'a') fp.write('***********drawCount=%d, drawCanvasCount=%d, doCanvasCount=%d*********\n' % (canvas.drawCount, self.drawCanvasCount, self.doCanvasCount)) printStackTrace(fp) fp.close() ''' #print 'drawCanvas1', self.window.name, canvas.drawCount canvas.drawCount = canvas.drawCount + 1 self.after_idle(lambda: self.drawCanvasReal(canvas, row, col)) #print 'drawCanvas2', self.window.name # overrides WindowDraw version def drawCanvasReal(self, canvas, row, col): #print 'drawCanvasReal0', self.window.name canvas.drawCount = canvas.drawCount - 1 #print 'drawCanvasReal1', self.window.name, canvas.drawCount if (canvas.drawCount): return # only draw when there is only one request remaining #print 'drawCanvasReal2', self.window.name if (not hasattr(canvas, 'canvas_width')): #canvas.beingDrawn = False return if (not hasattr(canvas, 'xview_region')): #canvas.beingDrawn = False return #print 'drawCanvasReal1', self.window.name, canvas.canvas_width, canvas.canvas_height self.doCanvasCount = self.doCanvasCount + 1 self.setupWidgetHandler(canvas, isCanvas=True) try: canvas.doubleBuffer = True canvas.initTime = time.time() canvas.handler.makeCurrent() canvas.handler.startBack() canvas.handler.clearXor() canvas.handler.expose(0, 0, canvas.canvas_width, canvas.canvas_height) self.doCanvas(canvas.handler, canvas, row, col) canvas.handler.flush() # doing an after_idle probably messes things up since can # have multiple draws before a single swapBuffer is called ##canvas.after_idle(canvas.handler.swapBuffers) canvas.handler.swapBuffers() #canvas.beingDrawn = False except WindowTimeoutException: #print 'drawCanvasReal: about to single buffer doCanvas', self.window.name canvas.doubleBuffer = False canvas.handler.makeCurrent() canvas.handler.clearXor() canvas.handler.startFront() canvas.handler.expose(0, 0, canvas.canvas_width, canvas.canvas_height) self.doCanvas(canvas.handler, canvas, row, col) canvas.handler.flush() except Implementation.ApiError, e: print 'Drawing real canvas error:', e.error_msg #canvas.beingDrawn = False except self.handlerExc, e: print 'Drawing real canvas handler error:', e except ContourFile.error, e: print 'Drawing real canvas ContourFile error:', e except SliceFile.error, e: print 'Drawing real canvas SliceFile error:', e except ContourLevels.error, e: print 'Drawing real canvas ContourLevels error:', e except ContourStyle.error, e: print 'Drawing real canvas ContourStyle error:', e except PeakList.error, e: print 'Drawing real canvas PeakList error:', e except WinPeakList.error, e: print 'Drawing real canvas WinPeakList error:', e except: #canvas.beingDrawn = False #print 'Unknown drawing real canvas error' pass #print 'drawCanvas2', self.window.name self.waitResize = 0 # overrides WindowDraw version def drawRow(self, row): if (self.window.isDeleted): return #print 'WindowPopup: drawRow1' ncols = self.getNCols() for i in range(ncols): canvas = self.scrolled_window.canvases[row][i] self.drawCanvas(canvas, row, i) #print 'WindowPopup: drawRow2' # overrides WindowDraw version def drawCol(self, col): if (self.window.isDeleted): return nrows = self.getNRows() for j in range(nrows): canvas = self.scrolled_window.canvases[j][col] self.drawCanvas(canvas, j, col) # overrides WindowDraw version def drawAll(self, *extra): if (self.window.isDeleted): return #print 'WindowPopup: drawAll1' self.setSpectrumSelector() self.setStripsSelectorAfter() # exceptions caught here because called with after_idle try: w = self.scrolled_window for j in range(w.nrows): self.drawRow(j) self.drawAllSlices() except Implementation.ApiError, e: print 'Drawing all error:', e.error_msg except self.handlerExc, e: print 'Drawing all handler error:', e except ContourFile.error, e: print 'Drawing all ContourFile error:', e except SliceFile.error, e: print 'Drawing all SliceFile error:', e except PeakList.error, e: print 'Drawing all PeakList error:', e except WinPeakList.error, e: print 'Drawing all WinPeakList error:', e except ContourLevels.error, e: print 'Drawing all ContourLevels error:', e except ContourStyle.error, e: print 'Drawing all ContourStyle error:', e except: #print 'Unknown drawing all error' pass #print 'WindowPopup: drawAll2' self.waitPeak = 0 def drawViewSlice(self, slice, view): #print 'drawViewSliceA', view.dataSource.name label = slice.label sliceFile = view.sliceFile.get(label) if (not sliceFile): return #print 'drawViewSliceB', view.dataSource.name handler = slice.handler # TBD: do again when view.sliceColor in data model name = Util.getSpectrumSliceColor(view.dataSource) color = view.root.findFirstColor(name=name) if (not color): color = view.root.findFirstColor(name='black') handler.setColor((color.r, color.g, color.b)) #print 'drawViewSliceC', view.dataSource.name position = view.dataSource.numDim * [0] for axisMapping in view.axisMappings: axisPanel = self.window.findFirstAxisPanel(label=axisMapping.label) if (axisPanel.label == label): # position irrelevant for this dim continue if (not hasattr(axisPanel, 'pointLocation')): return if ((axisPanel.label not in ('x', 'y')) and (slice.orient == Tkinter.HORIZONTAL)): col = self.scrolled_window.getSliceCol(slice) axisRegion = axisPanel.axisRegions[col] p = self.calcAxisMidpoint(axisRegion) else: p = axisPanel.pointLocation if (p is None): return dataDim = axisMapping.dataDim # -1 below to get points starting from 0 p = Util.convertPosition(p, dataDim.dataDimRefs[0], fromUnit=axisPanel.axisUnit.unit) - 1 n = dataDim.numPointsOrig p = position[dataDim.dim-1] = p % n if (p >= dataDim.numPoints): return #print 'drawViewSlice1', label, position, view.dataSource.name slicePanel = self.window.findFirstSlicePanel(label=label) y0 = 0.0 y1 = 1.0 (b0, b1) = self.window.sliceRange scale = view.dataSource.scale (b0, b1) = (b0/scale, b1/scale) axisMapping = view.findFirstAxisMapping(label=label) dataDim = axisMapping.dataDim axisPanel = self.window.findFirstAxisPanel(label=label) (t0, t1) = Util.convertRegion(slice.view_region, axisPanel.axisUnit, dataDim) if (t0 > t1): (t0, t1) = (t1, t0) dataDimRef = dataDim.dataDimRefs[0] expDimRef = dataDimRef.expDimRef minAliasedFreq = expDimRef.minAliasedFreq maxAliasedFreq = expDimRef.maxAliasedFreq unit = axisPanel.axisType.axisUnits[0].unit if (maxAliasedFreq is None): minFreqPts = 0.0 else: minFreqPts = Util.convertPosition(maxAliasedFreq, dataDimRef, unit) - 1.0 if (minAliasedFreq is None): maxFreqPts = float(dataDim.numPoints) - 1.0 else: maxFreqPts = Util.convertPosition(minAliasedFreq, dataDimRef, unit) - 1.0 n = dataDim.numPointsOrig tile0 = int(math.floor(max(t0, minFreqPts) / n)) tile1 = int(math.floor(min(t1, maxFreqPts) / n)) #print 'drawViewSlice2', label, t0, t1, n, tile0, tile1 for tile in range(tile0, tile1+1): o = tile * n if (tile == tile0): s0 = t0 else: s0 = tile * n if (tile == tile1): s1 = t1 else: s1 = (tile+1) * n #print 'drawViewSlice3', label, tile, s0, s1, t0, t1 s0 = max(s0, minFreqPts) s1 = min(s1, maxFreqPts) #print 'drawViewSlice4', label, tile, s0, s1, t0, t1 if (s1 <= s0): continue x0 = (s0-t0) / (t1-t0) x1 = (s1-t0) / (t1-t0) # TBD: here set s0 and s1 to lie in freq range of spectrum a0 = float(s0 - o) a1 = float(s1 - o) first = int(math.floor(a0)) last = min(n, int(math.ceil(a1+1))) #print 'drawViewSlice5', label, x0, y0, x1, y1, a0, b0, a1, b1 if (slice.orient == Tkinter.HORIZONTAL): handler.mapRanges(x0, y0, x1, y1, a0, b0, a1, b1) else: # note b1, b0 swap, due to wanting positive values to point left, not right handler.mapRanges(y0, x0, y1, x1, b1, a0, b0, a1) #print 'drawViewSlice6', label, first, last, position sliceFile.draw(handler, first, last, position) #print 'drawViewSlice7', label def doSlice(self, slice): for view in self.window.spectrumWindowViews: #print 'doSlice', view.dataSource.name, view.isSliceVisible if (view.isSliceVisible): self.drawViewSlice(slice, view) slice.handler.flush() self.drawSliceAxis(slice) def drawSlice(self, slice): if (self.state() != 'normal'): return if (not hasattr(slice, 'drawCount')): slice.drawCount = 0 slice.drawCount = slice.drawCount + 1 self.after_idle(lambda: self.drawSliceReal(slice)) def drawSliceReal(self, slice): slice.drawCount = slice.drawCount - 1 if (slice.drawCount): return # only draw when there is only one request remaining if (not hasattr(slice, 'slice_width')): return if (not hasattr(slice, 'view_region')): return #print 'drawSliceReal', slice.slice_width, slice.slice_height self.setupWidgetHandler(slice, isCanvas=False) try: handler = slice.handler handler.makeCurrent() handler.startBack() handler.clearXor() slice.handler.expose(0, 0, slice.slice_width, slice.slice_height) self.doSlice(slice) handler.swapBuffers() except Implementation.ApiError, e: print 'Drawing slice error:', e.error_msg except self.handlerExc, e: print 'Drawing slice handler error:', e except SliceFile.error, e: print 'Drawing slice SliceFile error:', e except: #print 'Unknown drawing slice error' pass try: if (slice.label == 'x'): self.drawSliceCrosshair(slice, x=self.window.axisPanels[0].pointLocation) else: self.drawSliceCrosshair(slice, y=self.window.axisPanels[1].pointLocation) except: pass def drawAllSlices(self): slicePanel = self.window.slicePanels[0] if (slicePanel.isVisible): for i in range(self.scrolled_window.ncols): self.drawSlice(self.scrolled_window.xslices[i]) slicePanel = self.window.slicePanels[1] if (slicePanel.isVisible): for j in range(self.scrolled_window.nrows): self.drawSlice(self.scrolled_window.yslices[j]) def drawSliceAxis(self, slice): handler = slice.handler color = self.window.background color = (1.0-color.r, 1.0-color.g, 1.0-color.b) handler.setColor(color) slicePanel = self.window.findFirstSlicePanel(label=slice.label) y0 = 0.0 y1 = 1.0 (b0, b1) = self.window.sliceRange x0 = 0.0 x1 = 1.0 a0 = 0.0 a1 = 1.0 if (slice.orient == Tkinter.HORIZONTAL): handler.mapRanges(x0, y0, x1, y1, a0, b0, a1, b1) handler.drawLine(0.0, 0.0, 1.0, 0.0) else: handler.mapRanges(y0, x0, y1, x1, b0, a0, b1, a1) handler.drawLine(0.0, 0.0, 0.0, 1.0) def drawSliceCrosshair(self, slice, x = None, y = None): if (not self.parent.isCrosshairVisible()): return self.setupWidgetHandler(slice, isCanvas=False) handler = slice.handler handler.makeCurrent() handler.startXor() handler.setBlack() # above in xor mode means that below will appear in inverse colors handler.mapRanges(0, 0, 1, 1, 0, 0, 1, 1) if (x is not None): (x0, x1) = slice.view_region x = float(x - x0) / (x1 - x0) handler.drawLine(x, 0, x, 1) if (y is not None): (y0, y1) = slice.view_region y = float(y - y0) / (y1 - y0) handler.drawLine(0, y, 1, y) handler.finishXor() def initAxisPanel(self, axisPanel): if (axisPanel.spectrumWindow != self.window): return self.createRegionSelector(axisPanel) def deleteAxisPanel(self, axisPanel): if (axisPanel.spectrumWindow != self.window): return self.deleteRegionSelector(axisPanel) # TBD: could make initPeak and drawPeak more intelligent def initPeak(self, peak): if self.waitPeak: return self.waitPeak = 1 self.after_idle(self.drawAll) def deletePeak(self, peak): if self.waitPeak: return self.waitPeak = 1 self.after_idle(self.drawAll) def splitWindowHorizontal(self, event): pass def splitWindowVertical(self, event): canvas = event.widget col = self.scrolled_window.getCanvasRowCol(canvas)[1] self.scrolled_window.splitWindowVertical(event) new_canvas = self.scrolled_window.canvases[0][col+1] # row 0 arbitrary (r0, r1) = new_canvas.xview_region if (r0 > r1): (r0, r1) = (r1, r0) Util.addAxisPanelRegion(self.window.axisPanels[0], region=(r0, r1), size=new_canvas.winfo_width()) self.setHandlersCol(col+1) self.setHandlerBackground() def addRow(self, *event): #self.scrolled_window.oneWeights() self.scrolled_window.addRow() row = -1 canvas = self.scrolled_window.canvases[row][0] # col 0 arbitrary (r0, r1) = canvas.yview_region if (r0 > r1): (r0, r1) = (r1, r0) Util.addAxisPanelRegion(self.window.axisPanels[1], region=(r0, r1), size=canvas.winfo_height()) self.setHandlersRow(row) self.setHandlerBackground() def deleteRow(self): #self.scrolled_window.oneWeights() self.scrolled_window.deleteRow() self.window.axisPanels[1].axisRegions[-1].delete() def shuffleAxisRegions(self, sourceCol = -1, targetCol = -1): if (sourceCol == -1): return axisPanels = self.window.axisPanels n = len(axisPanels[0].axisRegions) if (targetCol == -1): targetCol = n - 1 #print 'shuffleAxisRegions2', sourceCol, targetCol if (sourceCol == targetCol): return if (sourceCol < targetCol): d = 1 else: d = -1 for i in range(len(axisPanels)): if (i == 1): # do not need to do y continue axisRegions = axisPanels[i].axisRegions region = axisRegions[sourceCol].region size = axisRegions[sourceCol].size isActive = axisRegions[sourceCol].isActive n = len(axisRegions) for j in range(sourceCol, targetCol, d): axisRegions[j].region = axisRegions[j+d].region axisRegions[j].size = axisRegions[j+d].size axisRegions[j].isActive = axisRegions[j+d].isActive axisRegions[targetCol].region = region axisRegions[targetCol].size = size axisRegions[targetCol].isActive = isActive def addCol(self, col = -1, centerPositionDict = None): #print 'addCol1', col if (centerPositionDict is None): centerPositionDict = {} #self.scrolled_window.oneWeights() # need to append everything as far as scrolled_window concerned # otherwise handlers and regions get confused # then need to do shuffle on axis regions to make up for this ###self.scrolled_window.addCol(col) self.scrolled_window.addCol() canvas = self.scrolled_window.canvases[0][col] # row 0 arbitrary (r0, r1) = canvas.xview_region if (r0 > r1): (r0, r1) = (r1, r0) #print 'WindowPopup.addCol', (r0, r1) Util.addAxisPanelRegion(self.window.axisPanels[0], region=(r0, r1), size=canvas.winfo_width()) # see above note ###self.setHandlersCol(col) self.setHandlersCol() self.setHandlerBackground() self.shuffleAxisRegions(sourceCol=col) if (col != -1): # reset region to be that of strip where event set off if (col == 0): col = 1 axisPanels = self.window.axisPanels for i in range(len(axisPanels)): if (i == 1): # do not need to do y continue axisRegions = axisPanels[i].axisRegions axisRegions[col].region = axisRegions[col-1].region if len(self.window.axisPanels[0].axisRegions) > 1: self.stripsButtons.buttons[1].enable() if col == -1: self.activateStrip(len(self.window.axisPanels[0].axisRegions)-1) else: self.activateStrip(col) for label in centerPositionDict.keys(): axisPanel = self.window.findFirstAxisPanel(label=label) axisRegion = axisPanel.axisRegions[col] centerAxisRegion(axisRegion, centerPositionDict[label]) def deleteCol(self, col = -1): #print 'deleteCol', col self.update_idletasks() # see if this helps crashing stop #self.scrolled_window.oneWeights() N = len(self.window.axisPanels[0].axisRegions) if N > 1: active_col = self.getActiveStrip() if (col == -1) and (active_col != 'all'): col = active_col self.scrolled_window.deleteCol(col) WindowDraw.deleteCol(self, col) if (active_col == col): self.activateStrip(min(col, N-2)) # new active col if N < 3: self.stripsButtons.buttons[1].disable() def findPositionMatches(self, peaks, dimNum, peakList=None): peakLists = [] # only want peaks represented in the current window checkPeakLists = [] for view in self.window.spectrumWindowViews: for winPeakList in view.windowPeakLists: try: peakList = winPeakList.peakList except: peakList = None if (peakList and not peakList.isDeleted): checkPeakLists.append(peakList) for peak in peaks: if peak.peakList not in checkPeakLists: peaks.remove(peak) for peak in peaks: createPeakDimRuler(peak.peakDims[dimNum],self.window,remove=False) if peak.peakList not in peakLists: peakLists.append(peak.peakList) groups = findPositionMatches(peaks, dimNum, peakList) self.parent.viewPeakGroups(groups,dimNum,peakLists) def makeIntermediatePeak(self, *event): peaks = self.parent.currentPeaks if peaks: makeIntermediatePeak(peaks) def gotoOrthogonalPlane(self, window, position): self.parent.gotoPosition(window_name=window.name, position=position ) def predictSpinSystemType(self, *event): if self.menuPeak: spinSystem = None for peakDim in self.menuPeak.peakDims: for contrib in peakDim.peakDimContribs: if contrib.resonance.resonanceGroup: spinSystem = contrib.resonance.resonanceGroup break else: continue break if spinSystem: self.parent.typeSpinSystem(spinSystem=spinSystem) def makeSeqSpinSystemConnections(self, seqOffsets, *event): peaks = [] if self.parent.currentPeaks: peaks = self.parent.currentPeaks elif self.menuPeak: peaks = [self.menuPeak,] for peak in peaks: addPeakResonancesToSeqSpinSystems(peak, seqOffsets) def showStructConnections(self, *event): peaks = [] if self.parent.currentPeaks: peaks = self.parent.currentPeaks elif self.menuPeak: peaks = [self.menuPeak,] if peaks: self.parent.viewStructure() popup = self.parent.popups['view_structure'] popup.clearConnections() for peak in peaks: popup.showPeakConnection(peak) def gotoOrthogonalAllPlanes(self, windowZplanes): for planeName, window, position in windowZplanes: self.gotoOrthogonalPlane(window, position) def peakCenterOrthogonalPlanes(self, event): canvas = event.widget col = self.scrolled_window.getCanvasRowCol(canvas)[1] position = {} if self.menuPeak: peak = self.menuPeak for view in self.window.spectrumWindowViews: if view.dataSource is peak.peakList.dataSource: for axisMapping in view.axisMappings: if axisMapping.label not in ('x','y'): for peakDim in peak.peakDims: if peakDim.dataDimRef.dataDim is axisMapping.dataDim: position[axisMapping.label] = getPeakDimPosition(peakDim, toUnit=peakDim.dataDimRef.expDimRef.unit) break self.parent.gotoPosition(window_name=self.window.name, position=position, col=col) def zoomToSpinSystem(self, event): peak = self.menuPeak if peak: canvas = event.widget col = self.scrolled_window.getCanvasRowCol(canvas)[1] specDict = {} for view in self.window.spectrumWindowViews: specDict[view.dataSource] = 1 ssDict = {} for peakDim in peak.peakDims: for contrib in peakDim.peakDimContribs: ss = contrib.resonance.resonanceGroup if ss: ssDict[ss] = ssDict.get(ss, 0) + 1 if ssDict: ssBest = ssDict.keys()[0] for ss in ssDict.keys(): if ssDict[ss] > ssDict[ssBest]: ssBest = ss peaks = [] for resonance in ssBest.resonances: for contrib in resonance.peakDimContribs: peak = contrib.peakDim.peak if specDict.get(peak.peakList.dataSource): peaks.append(peak) if peaks: zoomToShowPeaks(peaks, self.window, col) def zoomToSelectedPeaks(self, event): peaks = self.parent.currentPeaks if peaks: canvas = event.widget col = self.scrolled_window.getCanvasRowCol(canvas)[1] zoomToShowPeaks(peaks, self.window, col)

Top of Message | Previous Page | Permalink

JiscMail Tools


RSS Feeds and Sharing


Advanced Options


Archives

April 2024
March 2024
February 2024
January 2024
December 2023
November 2023
October 2023
September 2023
August 2023
July 2023
June 2023
May 2023
April 2023
March 2023
February 2023
January 2023
December 2022
November 2022
October 2022
September 2022
August 2022
July 2022
June 2022
May 2022
April 2022
March 2022
February 2022
January 2022
December 2021
November 2021
October 2021
September 2021
August 2021
July 2021
June 2021
May 2021
April 2021
March 2021
February 2021
January 2021
December 2020
November 2020
October 2020
September 2020
August 2020
July 2020
June 2020
May 2020
April 2020
March 2020
February 2020
January 2020
December 2019
November 2019
October 2019
September 2019
August 2019
July 2019
June 2019
May 2019
April 2019
March 2019
February 2019
January 2019
December 2018
November 2018
October 2018
September 2018
August 2018
July 2018
June 2018
May 2018
April 2018
March 2018
February 2018
January 2018
December 2017
November 2017
October 2017
September 2017
August 2017
July 2017
June 2017
May 2017
April 2017
March 2017
February 2017
January 2017
December 2016
November 2016
October 2016
September 2016
August 2016
July 2016
June 2016
May 2016
April 2016
March 2016
February 2016
January 2016
December 2015
November 2015
October 2015
September 2015
August 2015
July 2015
June 2015
May 2015
April 2015
March 2015
February 2015
January 2015
December 2014
November 2014
October 2014
September 2014
August 2014
July 2014
June 2014
May 2014
April 2014
March 2014
February 2014
January 2014
December 2013
November 2013
October 2013
September 2013
August 2013
July 2013
June 2013
May 2013
April 2013
March 2013
February 2013
January 2013
December 2012
November 2012
October 2012
September 2012
August 2012
July 2012
June 2012
May 2012
April 2012
March 2012
February 2012
January 2012
December 2011
November 2011
October 2011
September 2011
August 2011
July 2011
June 2011
May 2011
April 2011
March 2011
February 2011
January 2011
December 2010
November 2010
October 2010
September 2010
August 2010
July 2010
June 2010
May 2010
April 2010
March 2010
February 2010
January 2010
December 2009
November 2009
October 2009
September 2009
August 2009
July 2009
June 2009
May 2009
April 2009
March 2009
February 2009
January 2009
December 2008
November 2008
October 2008
September 2008
August 2008
July 2008
June 2008
May 2008
April 2008
March 2008
February 2008
January 2008
December 2007
November 2007
October 2007
September 2007
August 2007
July 2007
June 2007
May 2007
April 2007
March 2007
February 2007
January 2007
December 2006
November 2006
October 2006
September 2006
August 2006
July 2006
June 2006
May 2006
April 2006
March 2006
February 2006
January 2006
December 2005
November 2005
October 2005
September 2005
August 2005
July 2005
June 2005
May 2005
April 2005
March 2005
February 2005
January 2005
December 2004
November 2004
October 2004
September 2004
August 2004
July 2004
June 2004
May 2004
April 2004
March 2004
February 2004
January 2004
December 2003
November 2003
October 2003
September 2003


JiscMail is a Jisc service.

View our service policies at https://www.jiscmail.ac.uk/policyandsecurity/ and Jisc's privacy policy at https://www.jisc.ac.uk/website/privacy-notice

For help and support help@jisc.ac.uk

Secured by F-Secure Anti-Virus CataList Email List Search Powered by the LISTSERV Email List Manager