diff --git a/fsl/data/strings.py b/fsl/data/strings.py index e44661918c450926956342bcbd3bc4576d7f0ce6..a21dd084bb615466f83c8080e4cee459a616ea9f 100644 --- a/fsl/data/strings.py +++ b/fsl/data/strings.py @@ -527,16 +527,16 @@ properties = TypeDict({ 'ImageOpts.transform' : 'Image transform', 'ImageOpts.volume' : 'Volume', - 'VolumeOpts.displayRange' : 'Display range', - 'VolumeOpts.clippingRange' : 'Clipping range', - 'VolumeOpts.linkLowRanges' : 'Link low display/clipping ranges', - 'VolumeOpts.linkHighRanges' : 'Link high display/clipping ranges', - 'VolumeOpts.cmap' : 'Colour map', - 'VolumeOpts.negativeCmap' : '-ve colour map', - 'VolumeOpts.enableNegativeCmap' : '-ve colour map', - 'VolumeOpts.invert' : 'Invert colour map', - 'VolumeOpts.invertClipping' : 'Invert clipping range', - 'VolumeOpts.interpolation' : 'Interpolation', + 'VolumeOpts.displayRange' : 'Display range', + 'VolumeOpts.clippingRange' : 'Clipping range', + 'VolumeOpts.linkLowRanges' : 'Link low display/clipping ranges', + 'VolumeOpts.linkHighRanges' : 'Link high display/clipping ranges', + 'VolumeOpts.cmap' : 'Colour map', + 'VolumeOpts.negativeCmap' : '-ve colour map', + 'VolumeOpts.useNegativeCmap' : '-ve colour map', + 'VolumeOpts.invert' : 'Invert colour map', + 'VolumeOpts.invertClipping' : 'Invert clipping range', + 'VolumeOpts.interpolation' : 'Interpolation', 'MaskOpts.colour' : 'Colour', 'MaskOpts.invert' : 'Invert', diff --git a/fsl/fsleyes/autodisplay.py b/fsl/fsleyes/autodisplay.py index 98ee4a67014cc5ca36e518e424cf4e0202fdd606..fa9e0a1a6324659f3e0115438838a326ccfc8fbe 100644 --- a/fsl/fsleyes/autodisplay.py +++ b/fsl/fsleyes/autodisplay.py @@ -64,7 +64,7 @@ def _isStatImage(overlay): basename = op.basename(overlay.dataSource) basename = fslimage.removeExt(basename) tokens = ['zstat', 'tstat', 'fstat', 'zfstat'] - pattern = '_({})\d+'.format('|'.join(tokens)) + pattern = '({})\d+'.format('|'.join(tokens)) return re.search(pattern, basename) is not None @@ -90,7 +90,6 @@ def _statImageDisplay(overlay, overlayList, displayCtx): basename = op.basename(overlay.dataSource) basename = fslimage.removeExt(basename) - nameTokens = basename.split('_') pTokens = ['p', 'corrp'] statTokens = ['zstat', 'tstat', 'zfstat'] fStatTokens = ['fstat'] @@ -100,7 +99,7 @@ def _statImageDisplay(overlay, overlayList, displayCtx): # generated specifically for # use with the Render1 colour # map. - if 'rendered' in nameTokens: + if 'rendered' in basename: opts.cmap = 'Render1' # Give each normal stat image @@ -111,25 +110,28 @@ def _statImageDisplay(overlay, overlayList, displayCtx): _statImageDisplay.currentCmap += 1 _statImageDisplay.currentCmap %= len(_statImageDisplay.cmaps) opts.cmap = cmap + opts.negativeCmap = cmap # The order of these tests is # important, due to name overlap + print 'which one', basename + # P-value image ? - if any([token in nameTokens for token in pTokens]): + if any([token in basename for token in pTokens]): opts.displayRange = [0.95, 1.0] opts.clippingRange = [0.95, 1.0] # T or Z stat image? - elif any([token in nameTokens for token in statTokens]): - - opts.clippingRange = [-0.1, 0.1] - opts.displayRange = [-7.5, 7.5] - opts.centreRanges = True - opts.invertClipping = True + elif any([token in basename for token in statTokens]) and \ + 'rendered' not in basename: + + opts.clippingRange = [2.3, opts.dataMax] + opts.displayRange = [2.3, 7.5] + opts.useNegativeCmap = True # F stat image? - elif any([token in nameTokens for token in fStatTokens]): + elif any([token in basename for token in fStatTokens]): opts.displayRange = [0, 10] @@ -157,11 +159,11 @@ def _peImageDisplay(overlay, overlayList, displayCtx): """ opts = displayCtx.getOpts(overlay) - opts.cmap = 'Render3' - opts.clippingRange = [-1, 1] - opts.displayRange = [-100, 100] - opts.centreRanges = True - opts.invertClipping = True + opts.cmap = 'Red-Yellow' + opts.negativeCmap = 'Blue-LightBlue' + opts.displayRange = [1.0, 100.0] + opts.clippingRange = [1.0, opts.dataMax] + opts.useNegativeCmap = True def _FEATImageDisplay(overlay, overlayList, displayCtx): @@ -178,12 +180,11 @@ def _MelodicImageDisplay(overlay, overlayList, displayCtx): opts = displayCtx.getOpts(overlay) - opts.cmap = 'Render3' - opts.displayRange = [-5.0, 5.0] - opts.clippingRange = [-1.5, 1.5] - - opts.centreRanges = True - opts.invertClipping = True + opts.cmap = 'Red-Yellow' + opts.negativeCmap = 'Blue-LightBlue' + opts.displayRange = [1.5, 5.0] + opts.clippingRange = [1.5, opts.dataMax] + opts.useNegativeCmap = True def _ModelDisplay(overlay, display, overlayList, displayCtx): diff --git a/fsl/fsleyes/controls/overlaydisplaypanel.py b/fsl/fsleyes/controls/overlaydisplaypanel.py index 0c9fe561fbbfe8d04d06c7ad2be85a62f8f1b6af..c69721c3a4f62b230673ee3acd0b08bb5c5e1d44 100644 --- a/fsl/fsleyes/controls/overlaydisplaypanel.py +++ b/fsl/fsleyes/controls/overlaydisplaypanel.py @@ -237,7 +237,7 @@ class OverlayDisplayPanel(fslpanel.FSLEyesPanel): def __buildColourMapWidget(self, target, cmapWidget): """Builds a panel which contains widgets for controlling the :attr:`.VolumeOpts.cmap`, :attr:`.VolumeOpts.negativeCmap`, and - :attr:`.VolumeOpts.enableNegativeCmap`. + :attr:`.VolumeOpts.useNegativeCmap`. """ widgets = self.__widgets @@ -253,24 +253,23 @@ class OverlayDisplayPanel(fslpanel.FSLEyesPanel): loadAction.bindToWidget(self, wx.EVT_BUTTON, loadButton) # Negative colour map widget - negCmap = props.Widget('negativeCmap', - enabledWhen=lambda i, enc: enc, - dependencies=['enableNegativeCmap']) - enableNegCmap = props.Widget('enableNegativeCmap') + negCmap = props.Widget('negativeCmap', + enabledWhen=lambda i, enc: enc, + dependencies=['useNegativeCmap']) + useNegCmap = props.Widget('useNegativeCmap') - negCmap = props.buildGUI(widgets, target, negCmap) - enableNegCmap = props.buildGUI(widgets, target, enableNegCmap) + negCmap = props.buildGUI(widgets, target, negCmap) + useNegCmap = props.buildGUI(widgets, target, useNegCmap) - enableNegCmap.SetLabel( - strings.properties[target, 'enableNegativeCmap']) + useNegCmap.SetLabel(strings.properties[target, 'useNegativeCmap']) sizer = wx.FlexGridSizer(2, 2) sizer.AddGrowableCol(0) - sizer.Add(cmapWidget, flag=wx.EXPAND) - sizer.Add(loadButton, flag=wx.EXPAND) - sizer.Add(negCmap, flag=wx.EXPAND) - sizer.Add(enableNegCmap, flag=wx.EXPAND) + sizer.Add(cmapWidget, flag=wx.EXPAND) + sizer.Add(loadButton, flag=wx.EXPAND) + sizer.Add(negCmap, flag=wx.EXPAND) + sizer.Add(useNegCmap, flag=wx.EXPAND) return sizer diff --git a/fsl/fsleyes/displaycontext/volumeopts.py b/fsl/fsleyes/displaycontext/volumeopts.py index 4e303f0ec971d8566d2ba5167f443db9f3e67ced..599bce8b9bc4ab89c32a9bc660eb2441e6dbc6a4 100644 --- a/fsl/fsleyes/displaycontext/volumeopts.py +++ b/fsl/fsleyes/displaycontext/volumeopts.py @@ -494,13 +494,13 @@ class VolumeOpts(ImageOpts): negativeCmap = props.ColourMap() - """A second colour map, used if :attr:`enableNegativeCmap` is ``True``. + """A second colour map, used if :attr:`useNegativeCmap` is ``True``. When active, the :attr:`cmap` is used to colour positive values, and the :attr:`negativeCmap` is used to colour negative values. """ - enableNegativeCmap = props.Boolean(default=False) + useNegativeCmap = props.Boolean(default=False) """When ``True``, the :attr:`cmap` is used to colour positive values, and the :attr:`negativeCmap` is used to colour negative values. When this property is enabled, the minimum value for both the @@ -607,9 +607,9 @@ class VolumeOpts(ImageOpts): self .addListener('displayRange', self.name, self.__displayRangeChanged) - self .addListener('enableNegativeCmap', + self .addListener('useNegativeCmap', self.name, - self.__enableNegativeCmapChanged) + self.__useNegativeCmapChanged) self .addListener('linkLowRanges', self.name, self.__linkLowRangesChanged) @@ -630,13 +630,13 @@ class VolumeOpts(ImageOpts): display, display.getSyncPropertyName('contrast')) - # If enableNegativeCmap, linkLowRanges or linkHighRanges + # If useNegativeCmap, linkLowRanges or linkHighRanges # have been set to True (this will happen if they # are true on the parent VolumeOpts instance), make # sure the property / listener states are up to date. - if self.enableNegativeCmap: self.__enableNegativeCmapChanged() - if self.linkLowRanges: self.__linkLowRangesChanged() - if self.linkHighRanges: self.__linkHighRangesChanged() + if self.useNegativeCmap: self.__useNegativeCmapChanged() + if self.linkLowRanges: self.__linkLowRangesChanged() + if self.linkHighRanges: self.__linkHighRangesChanged() @actions.action @@ -741,7 +741,7 @@ class VolumeOpts(ImageOpts): See :func:`.colourmaps.displayRangeToBricon`. """ - if self.enableNegativeCmap: + if self.useNegativeCmap: return brightness, contrast = fslcm.displayRangeToBricon( @@ -757,14 +757,14 @@ class VolumeOpts(ImageOpts): self.__toggleListeners(True) - def __enableNegativeCmapChanged(self, *a): - """Called when the :attr:`enableNegativeCmap` property changes. + def __useNegativeCmapChanged(self, *a): + """Called when the :attr:`useNegativeCmap` property changes. Enables/disables the :attr:`.Display.brightness` and :attr:`.Display.contrast` properties, and configures limits on the :attr:`clippingRange` and :attr:`displayRange` properties. """ - if self.enableNegativeCmap: + if self.useNegativeCmap: self.display.disableProperty('brightness') self.display.disableProperty('contrast') self.displayRange .xmin = 0.0 diff --git a/fsl/fsleyes/gl/gl14/glvolume_funcs.py b/fsl/fsleyes/gl/gl14/glvolume_funcs.py index 9fa8aa1b5455cac044074d087f08cd12c5edbf2a..41a1bdbc5ee35561b3d5f2ea5d43f5968119004e 100644 --- a/fsl/fsleyes/gl/gl14/glvolume_funcs.py +++ b/fsl/fsleyes/gl/gl14/glvolume_funcs.py @@ -93,8 +93,8 @@ def updateShaderState(self): # And the clipping range, normalised # to the image texture value range - invClip = 1 if opts.invertClipping else -1 - useNegCmap = 1 if opts.enableNegativeCmap else 0 + invClip = 1 if opts.invertClipping else -1 + useNegCmap = 1 if opts.useNegativeCmap else 0 xform = self.imageTexture.invVoxValXform clipLo = opts.clippingRange[0] * xform[0, 0] + xform[3, 0] diff --git a/fsl/fsleyes/gl/gl21/glvolume_frag.glsl b/fsl/fsleyes/gl/gl21/glvolume_frag.glsl index 5b56722b1689e91bf76b86e20b90c7d2b0aad90d..12e0684fe3e55e8f5823ad1473ec5777ba46e43b 100644 --- a/fsl/fsleyes/gl/gl21/glvolume_frag.glsl +++ b/fsl/fsleyes/gl/gl21/glvolume_frag.glsl @@ -27,7 +27,7 @@ uniform sampler1D negColourTexture; * Flag which determines whether to * use the negative colour map. */ -uniform bool enableNegCmap; +uniform bool useNegCmap; /* * Shape of the imageTexture. @@ -61,7 +61,7 @@ uniform float clipHigh; /* * Value in the image texture data range which corresponds * to zero - this is used to determine whether to use the - * regular, or the negative colour texture (if enableNegCmap + * regular, or the negative colour texture (if useNegCmap * is true). */ uniform float texZero; @@ -87,8 +87,8 @@ void main(void) { float voxValue; vec4 normVoxValue; - bool useNegCmap = false; - vec3 voxCoord = fragVoxCoord; + bool negCmap = false; + vec3 voxCoord = fragVoxCoord; /* * Skip voxels that are out of the image bounds @@ -116,10 +116,10 @@ void main(void) { * value, and set a flag telling the code * below to use the neagtive colour map. */ - if (enableNegCmap && voxValue <= texZero) { + if (useNegCmap && voxValue <= texZero) { - useNegCmap = true; - voxValue = texZero + (texZero - voxValue); + negCmap = true; + voxValue = texZero + (texZero - voxValue); } /* @@ -138,6 +138,6 @@ void main(void) { */ normVoxValue = voxValXform * vec4(voxValue, 0, 0, 1); - if (useNegCmap) gl_FragColor = texture1D(negColourTexture, normVoxValue.x); - else gl_FragColor = texture1D(colourTexture, normVoxValue.x); + if (negCmap) gl_FragColor = texture1D(negColourTexture, normVoxValue.x); + else gl_FragColor = texture1D(colourTexture, normVoxValue.x); } diff --git a/fsl/fsleyes/gl/gl21/glvolume_funcs.py b/fsl/fsleyes/gl/gl21/glvolume_funcs.py index a0e87d615f59d0043b3f2c0993e19d1f88860a9d..ce9fffc1557c3b42d494473dd1c36b9c8f422921 100644 --- a/fsl/fsleyes/gl/gl21/glvolume_funcs.py +++ b/fsl/fsleyes/gl/gl21/glvolume_funcs.py @@ -70,8 +70,8 @@ def compileShaders(self): 'colourTexture') self.negColourTexturePos = gl.glGetUniformLocation(self.shaders, 'negColourTexture') - self.enableNegCmapPos = gl.glGetUniformLocation(self.shaders, - 'enableNegCmap') + self.useNegCmapPos = gl.glGetUniformLocation(self.shaders, + 'useNegCmap') self.texZeroPos = gl.glGetUniformLocation(self.shaders, 'texZero') self.imageShapePos = gl.glGetUniformLocation(self.shaders, @@ -113,11 +113,11 @@ def updateShaderState(self): clipHigh = opts.clippingRange[1] * xform[0, 0] + xform[3, 0] texZero = 0.0 * xform[0, 0] + xform[3, 0] - gl.glUniform1f(self.clipLowPos, clipLow) - gl.glUniform1f(self.clipHighPos, clipHigh) - gl.glUniform1f(self.texZeroPos, texZero) - gl.glUniform1f(self.invertClipPos, opts.invertClipping) - gl.glUniform1f(self.enableNegCmapPos, opts.enableNegativeCmap) + gl.glUniform1f(self.clipLowPos, clipLow) + gl.glUniform1f(self.clipHighPos, clipHigh) + gl.glUniform1f(self.texZeroPos, texZero) + gl.glUniform1f(self.invertClipPos, opts.invertClipping) + gl.glUniform1f(self.useNegCmapPos, opts.useNegativeCmap) # Bind transformation matrix to transform # from image texture values to voxel values, diff --git a/fsl/fsleyes/gl/glvolume.py b/fsl/fsleyes/gl/glvolume.py index 9c19c478467afd626255286d892341aa603c1e96..227a2042945ecf92e28cdf9c5228ca38a333bf82 100644 --- a/fsl/fsleyes/gl/glvolume.py +++ b/fsl/fsleyes/gl/glvolume.py @@ -227,7 +227,7 @@ class GLVolume(globject.GLImageObject): opts .addListener('invertClipping', lName, shaderUpdate, weak=False) opts .addListener('cmap', lName, colourUpdate, weak=False) opts .addListener('negativeCmap', lName, colourUpdate, weak=False) - opts .addListener('enableNegativeCmap', + opts .addListener('useNegativeCmap', lName, colourUpdate, weak=False) opts .addListener('invert', lName, colourUpdate, weak=False) opts .addListener('volume', lName, imageUpdate, weak=False) @@ -263,19 +263,19 @@ class GLVolume(globject.GLImageObject): lName = self.name - display.removeListener( 'alpha', lName) - opts .removeListener( 'displayRange', lName) - opts .removeListener( 'clippingRange', lName) - opts .removeListener( 'invertClipping', lName) - opts .removeListener( 'cmap', lName) - opts .removeListener( 'negativeCmap', lName) - opts .removeListener( 'enableNegativeCmap', lName) - opts .removeListener( 'cmap', lName) - opts .removeListener( 'invert', lName) - opts .removeListener( 'volume', lName) - opts .removeListener( 'resolution', lName) - opts .removeListener( 'interpolation', lName) - opts .removeListener( 'transform', lName) + display.removeListener( 'alpha', lName) + opts .removeListener( 'displayRange', lName) + opts .removeListener( 'clippingRange', lName) + opts .removeListener( 'invertClipping', lName) + opts .removeListener( 'cmap', lName) + opts .removeListener( 'negativeCmap', lName) + opts .removeListener( 'useNegativeCmap', lName) + opts .removeListener( 'cmap', lName) + opts .removeListener( 'invert', lName) + opts .removeListener( 'volume', lName) + opts .removeListener( 'resolution', lName) + opts .removeListener( 'interpolation', lName) + opts .removeListener( 'transform', lName) if self.__syncListenersRegistered: opts.removeSyncChangeListener('volume', lName) diff --git a/fsl/fsleyes/tooltips.py b/fsl/fsleyes/tooltips.py index f5c62a995f1a2249c63b3d2579ef56415a14c8e2..674becd8e8ee22494da8b8d7529b0b6cdb317ca8 100644 --- a/fsl/fsleyes/tooltips.py +++ b/fsl/fsleyes/tooltips.py @@ -80,12 +80,12 @@ properties = TypeDict({ 'voxels outside of the range are displayed.' 'This option is useful for displaying ' 'statistic images.', - 'VolumeOpts.cmap' : 'The colour map to use.', - 'VolumeOpts.negativeCmap' : 'The colour map to use for negative ' - 'values.', - 'VolumeOpts.enableNegativeCmap' : 'Enable the negative colour map - ' - 'this allows positive and negative ' - 'values to be coloured independently.', + 'VolumeOpts.cmap' : 'The colour map to use.', + 'VolumeOpts.negativeCmap' : 'The colour map to use for negative ' + 'values.', + 'VolumeOpts.useNegativeCmap' : 'Enable the negative colour map - ' + 'this allows positive and negative ' + 'values to be coloured independently.', 'VolumeOpts.interpolation' : 'Interpolate the image data for display ' 'purposes. You can choose no ' 'interpolation (equivalent to nearest '