public class DivaMainImageDisplay extends DivaGraphicsImageDisplay implements MainImageDisplay
JComponent.AccessibleJComponent
Container.AccessibleAWTContainer
Component.AccessibleAWTComponent, Component.BaselineResizeBehavior, Component.BltBufferStrategy, Component.FlipBufferStrategy
Modifier and Type | Field and Description |
---|---|
protected String |
_filename
Name of image file, if any
|
protected URL |
_origURL
The original image URL (before downloading, for history)
|
protected URL |
_url
The URL for the image, if one was specified (after downloading, if possible)
|
listenerList, TOOL_TIP_TEXT_KEY, ui, UNDEFINED_CONDITION, WHEN_ANCESTOR_OF_FOCUSED_COMPONENT, WHEN_FOCUSED, WHEN_IN_FOCUSED_WINDOW
accessibleContext, BOTTOM_ALIGNMENT, CENTER_ALIGNMENT, LEFT_ALIGNMENT, RIGHT_ALIGNMENT, TOP_ALIGNMENT
NO_SUCH_PAGE, PAGE_EXISTS
ABORT, ALLBITS, ERROR, FRAMEBITS, HEIGHT, PROPERTIES, SOMEBITS, WIDTH
Constructor and Description |
---|
DivaMainImageDisplay()
Default constructor.
|
DivaMainImageDisplay(Component parent)
Construct a DivaMainImageDisplay widget.
|
DivaMainImageDisplay(GraphicsPane pane)
Initialize with the given Diva GraphicsPane (contains the
layers used to draw the image and graphcs.
|
DivaMainImageDisplay(GraphicsPane pane,
Component parent)
Construct a DivaMainImageDisplay widget.
|
DivaMainImageDisplay(GraphicsPane pane,
Component parent,
ImageProcessor processor)
Construct a DivaMainImageDisplay widget.
|
DivaMainImageDisplay(GraphicsPane pane,
ImageProcessor processor)
Initialize with the given Diva GraphicsPane (contains the layers used to draw the image
and graphcs.
|
Modifier and Type | Method and Description |
---|---|
void |
addChangeListener(ChangeListener l)
register to receive change events from this object whenever the
image or cut levels are changed.
|
void |
addHistoryMenuItems(JMenu menu)
Add history items (for previously loaded images) to the given menu
|
protected void |
addToHistory()
Add the current URL to the history list
|
protected void |
addToHistory(ImageHistoryItem historyItem)
Add the given item to the history list, removing duplicates and
keeping the list size to a maximum of 20.
|
void |
back()
Go back to the previous image in the history list
|
void |
blankImage(double ra,
double dec)
Display a blank image with the given center coordinates
(15' * 60 seconds/minutes).
|
void |
checkExtensions(boolean show)
If there are multiple images and/or tables in the image file, pop up
a dialog to select the one to display.
|
protected boolean |
checkSave()
If the current image file has been modified (by adding or deleting a FITS extension,
for example), ask the user to confirm saving it.
|
protected void |
cleanupHistoryList()
Remove any items in the history list for files that no longer exist.
|
protected void |
cleanupImageCache()
Remove any files from the image cache that are no longer in the
history list.
|
void |
clear()
Clear the image display.
|
protected void |
clearHistory()
Add the current URL to the history list
|
void |
close()
Close the window
|
void |
displayFITSTable(int hdu)
Display the FITS table at the given HDU index (if supported).
|
void |
dispose()
Cleanup when the window is no longer needed.
|
protected void |
downloadImageToTempFile(URL url)
Download the given URL to a temporary file in a separate thread and then
display the image file when done.
|
void |
editColors()
Pop up a dialog window for displaying and setting the image colors.
|
void |
editCutLevels()
Pop up a dialog window for displaying and setting the image cut levls.
|
void |
exit()
Exit the application (called from exit menu).
|
boolean |
fileInHistoryList(File file)
Return true if the given file is referenced in the history list.
|
protected void |
fireChange(ImageChangeEvent e)
Notify any listeners of a change in the image or cut levels.
|
void |
forward()
Go forward to the next image in the history list
|
AbstractAction |
getBackAction()
Return the action for "Back"
|
WorldCoords |
getBasePos()
Return the base or center position in world coordinates.
|
CanvasDraw |
getCanvasDraw()
Return the object that manages interactive drawing on the image
|
AbstractAction |
getColorsAction() |
AbstractAction |
getCutLevelsAction() |
JDesktopPane |
getDesktop()
Return the JDesktopPane, if using internal frames, otherwise null
|
JFileChooser |
getFileChooser()
Obtain a reference to the file chooser in use.
|
String |
getFilename()
Return the image file name, if there is one.
|
FITSGraphics |
getFitsGraphics()
Return the object used to save graphics to a FITS table in the image and reload it again later.
|
FITSHDUChooser |
getFitsHDUChooser()
Return the panel for manipulating FITS extensions
|
Component |
getFitsHDUChooserFrame()
Return the top level window (or internal frame) for manipulating FITS extensions
|
Component |
getFitsKeywordsFrame()
Return the top level window (or internal frame) for viewing the FITS keywords.
|
AbstractAction |
getForwAction()
Return the action for "Forward"
|
Component |
getImageColorsFrame()
Return the top level window (or internal frame) for manipulating image colormaps
|
Component |
getImageCutLevelsFrame()
Return the top level windows (or internal frame) for setting cut levels
|
protected ImageHistoryItem |
getImageHistoryItem(File file)
Return the ImageHistoryItem from the history list, or null if not found.
|
Component |
getImagePropertiesFrame()
Return the top level window (or internal frame) for viewing image properties
|
int |
getMaxHistoryItems()
Return the max number of items in the history list.
|
String |
getObjectName()
Return the name of the object being displayed, if known, otherwise null.
|
AbstractAction |
getOpenAction()
Return the action for "Open"
|
Component |
getParentFrame()
Return the top level parent frame (or internal frame) used to close the window
|
Component |
getPickObjectFrame()
Return the top level window (or internal frame) for selecting image objects (stars, galaxies)
|
PickObject |
getPickObjectPanel()
Return the Pick Object panel, if initialized
|
AbstractAction |
getPrintAction() |
AbstractAction |
getPrintPreviewAction() |
Component |
getRootComponent()
Return the top level parent frame (or internal frame) used to close the window
|
AbstractAction |
getSaveAction() |
AbstractAction |
getSaveAsAction() |
String |
getTitle()
Return the frame's title.
|
URL |
getURL()
Return the image URL, if there is one.
|
protected void |
initFITSImage(FITSImage fitsImage)
Called after a new FITSImage object was created to do FITS specific initialization
|
protected void |
initProgressPanel()
Make the download progress panel if needed, and display it
|
boolean |
isJAIImageType(String filename)
Return true if the given filename has a suffix that indicates that it is
not a FITS file and is one of the standard JAI supported image types.
|
boolean |
isMainWindow()
Return true if this is the main application window (enables exit menu item)
|
boolean |
isSaveNeeded()
Return true if the image file has been modified and needs saving.
|
void |
loadCachedImage(double ra,
double dec)
If an image was previously loaded in this session with a center near the
given ra,dec coordinates, reload it, otherwise generate a blank image
with the center at those coordinates (in J2000).
|
protected void |
loadHistory()
Try to load the history list from a file, and create an empty list if that fails.
|
protected void |
loadImageFromURL(URL url)
Load an image directly from the given URL in a separate thread, so the user can monitor progress
and cancel it, if needed.
|
static JFileChooser |
makeImageFileChooser()
Create and return a new file chooser to be used to select an image file
to display.
|
protected ImageHistoryItem |
makeImageHistoryItem()
Make and return an ImageHistoryItem for the current image
|
protected LinkedList |
mergeHistoryList()
Merge the historyList with current serialized version (another instance
may have written it since we read it last).
|
protected void |
newImage(boolean before)
This method is called before and after a new image is loaded, each time
with a different argument.
|
Component |
newWindow()
Open up another window like this one and return a reference to it.
|
void |
open()
Display a file chooser to select a filename to display
|
void |
openURL()
Display a dialog to enter a URL to display
|
void |
paintImageAndGraphics(Graphics2D g2D)
Paint the image and graphics to the given graphics object (for save and print features)
|
protected void |
pickedObject()
Called when an object is selected in the Pick Object window.
|
void |
pickObject()
Pop up a dialog window to select objects (stars, galaxies) in the image
|
void |
print()
Pop up a dialog for printing the image.
|
void |
printPreview()
Display a preview of the what the printed image view will look like.
|
void |
removeChangeListener(ChangeListener l)
Stop receiving change events from this object.
|
void |
save()
Save any changes to the current image file.
|
void |
saveAs()
Pop up a dialog to ask the user for a file name, and then save the image
to the selected file.
|
void |
saveAs(String filename)
Save the current image to the given file, using an image format
based on the file suffix, which should be one of ".fits", ".jpg",
".png", or ".tif".
|
void |
saveGraphicsWithImage()
Save the current image graphics to a binary FITS table in the current image
|
protected void |
saveHistory(boolean merge)
Save the current history list to a file.
|
void |
setCanvasDraw(CanvasDraw canvasDraw)
PWD: Set the object that manages interactive drawing on the image
|
void |
setDesktop(JDesktopPane desktop)
Set the JDesktopPane to use for top level windows, if using internal frames
|
protected void |
setDownloadState(boolean downloading)
Set the state of the menubar/toolbar actions
|
void |
setFileChooser(JFileChooser chooser)
Set the file chooser to use when selecting files.
|
void |
setFilename(String fileOrUrl)
Set the image file to display.
|
void |
setFilename(String fileOrUrl,
URL url)
Set the image file to display and use the given URL for the image history
(the URL is used if the file is deleted).
|
void |
setMaxHistoryItems(int n)
Set the max number of items in the history list.
|
void |
setOrigin(Point2D.Double origin)
Set the origin of the image to display in canvas coordinates.
|
void |
setParentFrame(Component p)
Set the top level parent frame (or internal frame) used to close the window
|
void |
setSaveNeeded(boolean b)
Set to true if the image file has been modified and needs saving.
|
void |
setScale(float scale)
Set the scale (zoom factor) for the image.
|
void |
setTitle(String s)
Set the frame's basic title string.
|
void |
setURL(URL url)
Set the URL for the image to display.
|
protected void |
updateEnabledStates()
Update the enabled states of some menu/toolbar actions.
|
protected void |
updateImage(javax.media.jai.PlanarImage im)
This method updates the source image for this window, which is
scaled to the correct magnification before displaying.
|
void |
updateImageData()
Update the display to show the contents of the currently loaded image file.
|
protected void |
updateTitle()
Set the frame's title.
|
void |
viewFitsExtensions()
Pop up a dialog window for displaying a table of the FITS extensions
|
void |
viewFitsKeywords()
Pop up a dialog window for displaying the FITS Keywords.
|
void |
viewImageProperties()
Pop up a dialog window for displaying the image properties.
|
_getPixelValue, addImageGraphicsHandler, centerImage, getAffineTransform, getCanvas, getCanvasGraphics, getCoordinateConverter, getDisplayImage, getFitsImage, getImage, getImageHeight, getImageProcessor, getImageWidth, getInterpolation, getOrigin, getPixelValue, getPixelValues, getScale, getScaleHints, getVisibleArea, getWCS, initWCS, isAutoCenterImage, isClear, isImmediateMode, isInitialized, isPrescaled, isWCS, main, makeCanvasGraphics, notifyGraphicsHandlers, paintLayer, removeImageGraphicsHandler, scale, scaleToFit, scaleToFit, setAutoCenterImage, setImage, setImage, setImageProcessor, setImmediateMode, setInterpolation, setPrescaled, setScaleHints, setWCS, transformGraphics, transformGraphics, updateImage
getCanvasPane, getToolTipText, isFocusTraversable, paintComponent, print, print, processMouseEvent, processMouseMotionEvent, repaint, setCanvasPane, setDoubleBuffered, setPreferredSize
addAncestorListener, addNotify, addVetoableChangeListener, computeVisibleRect, contains, createToolTip, disable, enable, firePropertyChange, firePropertyChange, firePropertyChange, fireVetoableChange, getActionForKeyStroke, getActionMap, getAlignmentX, getAlignmentY, getAncestorListeners, getAutoscrolls, getBaseline, getBaselineResizeBehavior, getBorder, getBounds, getClientProperty, getComponentGraphics, getComponentPopupMenu, getConditionForKeyStroke, getDebugGraphicsOptions, getDefaultLocale, getFontMetrics, getGraphics, getHeight, getInheritsPopupMenu, getInputMap, getInputMap, getInputVerifier, getInsets, getInsets, getListeners, getLocation, getMaximumSize, getMinimumSize, getNextFocusableComponent, getPopupLocation, getPreferredSize, getRegisteredKeyStrokes, getRootPane, getSize, getToolTipLocation, getToolTipText, getTopLevelAncestor, getTransferHandler, getUIClassID, getVerifyInputWhenFocusTarget, getVetoableChangeListeners, getVisibleRect, getWidth, getX, getY, grabFocus, hide, isDoubleBuffered, isLightweightComponent, isManagingFocus, isOpaque, isOptimizedDrawingEnabled, isPaintingForPrint, isPaintingOrigin, isPaintingTile, isRequestFocusEnabled, isValidateRoot, paint, paintBorder, paintChildren, paintImmediately, paintImmediately, paramString, print, printAll, printBorder, printChildren, printComponent, processComponentKeyEvent, processKeyBinding, processKeyEvent, putClientProperty, registerKeyboardAction, registerKeyboardAction, removeAncestorListener, removeNotify, removeVetoableChangeListener, repaint, repaint, requestDefaultFocus, requestFocus, requestFocus, requestFocusInWindow, requestFocusInWindow, resetKeyboardActions, reshape, revalidate, scrollRectToVisible, setActionMap, setAlignmentX, setAlignmentY, setAutoscrolls, setBackground, setBorder, setComponentPopupMenu, setDebugGraphicsOptions, setDefaultLocale, setEnabled, setFocusTraversalKeys, setFont, setForeground, setInheritsPopupMenu, setInputMap, setInputVerifier, setMaximumSize, setMinimumSize, setNextFocusableComponent, setOpaque, setRequestFocusEnabled, setToolTipText, setTransferHandler, setUI, setVerifyInputWhenFocusTarget, setVisible, unregisterKeyboardAction, update, updateUI
add, add, add, add, add, addContainerListener, addImpl, addPropertyChangeListener, addPropertyChangeListener, applyComponentOrientation, areFocusTraversalKeysSet, countComponents, deliverEvent, doLayout, findComponentAt, findComponentAt, getComponent, getComponentAt, getComponentAt, getComponentCount, getComponents, getComponentZOrder, getContainerListeners, getFocusTraversalKeys, getFocusTraversalPolicy, getLayout, getMousePosition, insets, invalidate, isAncestorOf, isFocusCycleRoot, isFocusCycleRoot, isFocusTraversalPolicyProvider, isFocusTraversalPolicySet, layout, list, list, locate, minimumSize, paintComponents, preferredSize, printComponents, processContainerEvent, processEvent, remove, remove, removeAll, removeContainerListener, setComponentZOrder, setFocusCycleRoot, setFocusTraversalPolicy, setFocusTraversalPolicyProvider, setLayout, transferFocusDownCycle, validate, validateTree
action, add, addComponentListener, addFocusListener, addHierarchyBoundsListener, addHierarchyListener, addInputMethodListener, addKeyListener, addMouseListener, addMouseMotionListener, addMouseWheelListener, bounds, checkImage, checkImage, coalesceEvents, contains, createImage, createImage, createVolatileImage, createVolatileImage, disableEvents, dispatchEvent, enable, enableEvents, enableInputMethods, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, firePropertyChange, getAccessibleContext, getBackground, getBounds, getColorModel, getComponentListeners, getComponentOrientation, getCursor, getDropTarget, getFocusCycleRootAncestor, getFocusListeners, getFocusTraversalKeysEnabled, getFont, getForeground, getGraphicsConfiguration, getHierarchyBoundsListeners, getHierarchyListeners, getIgnoreRepaint, getInputContext, getInputMethodListeners, getInputMethodRequests, getKeyListeners, getLocale, getLocation, getLocationOnScreen, getMouseListeners, getMouseMotionListeners, getMousePosition, getMouseWheelListeners, getName, getParent, getPeer, getPropertyChangeListeners, getPropertyChangeListeners, getSize, getToolkit, getTreeLock, gotFocus, handleEvent, hasFocus, imageUpdate, inside, isBackgroundSet, isCursorSet, isDisplayable, isEnabled, isFocusable, isFocusOwner, isFontSet, isForegroundSet, isLightweight, isMaximumSizeSet, isMinimumSizeSet, isPreferredSizeSet, isShowing, isValid, isVisible, keyDown, keyUp, list, list, list, location, lostFocus, mouseDown, mouseDrag, mouseEnter, mouseExit, mouseMove, mouseUp, move, nextFocus, paintAll, postEvent, prepareImage, prepareImage, processComponentEvent, processFocusEvent, processHierarchyBoundsEvent, processHierarchyEvent, processInputMethodEvent, processMouseWheelEvent, remove, removeComponentListener, removeFocusListener, removeHierarchyBoundsListener, removeHierarchyListener, removeInputMethodListener, removeKeyListener, removeMouseListener, removeMouseMotionListener, removeMouseWheelListener, removePropertyChangeListener, removePropertyChangeListener, repaint, repaint, repaint, resize, resize, setBounds, setBounds, setComponentOrientation, setCursor, setDropTarget, setFocusable, setFocusTraversalKeysEnabled, setIgnoreRepaint, setLocale, setLocation, setLocation, setName, setSize, setSize, show, show, size, toString, transferFocus, transferFocusBackward, transferFocusUpCycle
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
getCanvasGraphics, getFitsImage, getPixelValue, getPixelValues, isClear
addImageGraphicsHandler, getCanvas, getCoordinateConverter, getDisplayImage, getImage, getImageHeight, getImageProcessor, getImageWidth, getInterpolation, getOrigin, getScale, getScaleHints, getVisibleArea, getWCS, isAutoCenterImage, isImmediateMode, isInitialized, isPrescaled, isWCS, removeImageGraphicsHandler, scaleToFit, setAutoCenterImage, setImage, setImageProcessor, setImmediateMode, setInterpolation, setPrescaled, setScaleHints, setWCS, updateImage
protected String _filename
protected URL _url
protected URL _origURL
public DivaMainImageDisplay(GraphicsPane pane)
pane
- the Diva GraphicsPane to use (contains the layers
used to display the image and graphics)public DivaMainImageDisplay(GraphicsPane pane, ImageProcessor processor)
pane
- the Diva GraphicsPane to use (contains the layers used to display the
image and graphics)processor
- the ImageProcessor to usepublic DivaMainImageDisplay()
public DivaMainImageDisplay(GraphicsPane pane, Component parent, ImageProcessor processor)
pane
- the Diva GraphicsPane to use (contains the layers used to display the
image and graphics)parent
- the top level parent frame (or internal frame) used to close the windowprocessor
- an ImageProcessorpublic DivaMainImageDisplay(GraphicsPane pane, Component parent)
pane
- the Diva GraphicsPane to use (contains the layers used to display the
image and graphics)parent
- the top level parent frame (or internal frame) used to close the windowpublic DivaMainImageDisplay(Component parent)
pane
- the Diva GraphicsPane to use (contains the layers used to display the
image and graphics)parent
- the top level parent frame (or internal frame) used to close the windowpublic Component newWindow()
Note: derived classes should redefine this to return an instance of the correct class, which should be derived JFrame or JInternalFrame.
public CanvasDraw getCanvasDraw()
public void setCanvasDraw(CanvasDraw canvasDraw)
public void setFilename(String fileOrUrl)
setFilename
in interface MainImageDisplay
public void setFilename(String fileOrUrl, URL url)
setFilename
in interface MainImageDisplay
public String getFilename()
getFilename
in interface MainImageDisplay
public boolean isJAIImageType(String filename)
public void clear()
clear
in interface GraphicsImageDisplay
clear
in class DivaGraphicsImageDisplay
public void displayFITSTable(int hdu)
displayFITSTable
in interface MainImageDisplay
public String getObjectName()
getObjectName
in interface MainImageDisplay
public void setURL(URL url)
setURL
in interface MainImageDisplay
public URL getURL()
getURL
in interface MainImageDisplay
protected void initFITSImage(FITSImage fitsImage) throws IOException, FitsException
IOException
FitsException
public void updateImageData()
updateImageData
in interface MainImageDisplay
protected void addToHistory()
protected void addToHistory(ImageHistoryItem historyItem)
protected ImageHistoryItem makeImageHistoryItem()
public int getMaxHistoryItems()
public void setMaxHistoryItems(int n)
protected LinkedList mergeHistoryList()
protected void clearHistory()
protected void saveHistory(boolean merge)
merge
- if true, merge the list with the existing list on disk.protected void loadHistory()
protected void cleanupHistoryList()
protected void cleanupImageCache()
public boolean fileInHistoryList(File file)
protected ImageHistoryItem getImageHistoryItem(File file)
protected void initProgressPanel()
protected void loadImageFromURL(URL url)
protected void downloadImageToTempFile(URL url)
protected void setDownloadState(boolean downloading)
downloading
- set to true if an image is being downloadedprotected void updateEnabledStates()
public void back()
public void forward()
public void loadCachedImage(double ra, double dec)
public void addHistoryMenuItems(JMenu menu)
public void addChangeListener(ChangeListener l)
addChangeListener
in interface MainImageDisplay
public void removeChangeListener(ChangeListener l)
removeChangeListener
in interface MainImageDisplay
protected void fireChange(ImageChangeEvent e)
public boolean isMainWindow()
public void exit()
protected void newImage(boolean before)
newImage
in class DivaGraphicsImageDisplay
before
- set to true before the image is loaded and false afterwardsprotected void updateImage(javax.media.jai.PlanarImage im)
updateImage
in class DivaGraphicsImageDisplay
public void setOrigin(Point2D.Double origin)
setOrigin
in interface BasicImageDisplay
setOrigin
in class DivaGraphicsImageDisplay
public void setScale(float scale)
setScale
in interface BasicImageDisplay
setScale
in class DivaGraphicsImageDisplay
public void checkExtensions(boolean show)
show
- if true, always show the window, if there are any extensions,
otherwise, just update the window if it is already showing
or show it if the primary extension is empty.public void saveGraphicsWithImage()
public void close()
public void dispose()
public void editCutLevels()
public void editColors()
public void pickObject()
protected void pickedObject()
public void viewFitsExtensions()
public void viewFitsKeywords()
public void viewImageProperties()
public JDesktopPane getDesktop()
public void setDesktop(JDesktopPane desktop)
public Component getRootComponent()
getRootComponent
in interface MainImageDisplay
public void open()
public static JFileChooser makeImageFileChooser()
public JFileChooser getFileChooser()
public void setFileChooser(JFileChooser chooser)
public void openURL()
public void blankImage(double ra, double dec)
blankImage
in interface GraphicsImageDisplay
blankImage
in class DivaGraphicsImageDisplay
ra
- RA center coordinate in deg J2000dec
- Dec center coordinate in deg J2000public void setSaveNeeded(boolean b)
setSaveNeeded
in interface MainImageDisplay
public boolean isSaveNeeded()
protected boolean checkSave()
public void save()
public void saveAs()
saveAs
in interface MainImageDisplay
public void saveAs(String filename)
saveAs
in interface MainImageDisplay
public void paintImageAndGraphics(Graphics2D g2D)
paintImageAndGraphics
in interface MainImageDisplay
public void printPreview()
public void print()
print
in interface MainImageDisplay
public void setTitle(String s)
public String getTitle()
protected void updateTitle()
public Component getParentFrame()
public void setParentFrame(Component p)
public AbstractAction getOpenAction()
GenericToolBarTarget
getOpenAction
in interface GenericToolBarTarget
public AbstractAction getBackAction()
GenericToolBarTarget
getBackAction
in interface GenericToolBarTarget
public AbstractAction getForwAction()
GenericToolBarTarget
getForwAction
in interface GenericToolBarTarget
public AbstractAction getColorsAction()
public AbstractAction getCutLevelsAction()
public AbstractAction getSaveAction()
public AbstractAction getSaveAsAction()
public AbstractAction getPrintPreviewAction()
public AbstractAction getPrintAction()
public Component getImageCutLevelsFrame()
public Component getFitsKeywordsFrame()
public Component getImagePropertiesFrame()
public Component getImageColorsFrame()
public Component getPickObjectFrame()
public PickObject getPickObjectPanel()
public Component getFitsHDUChooserFrame()
public FITSHDUChooser getFitsHDUChooser()
public FITSGraphics getFitsGraphics()
public WorldCoords getBasePos()
getBasePos
in interface MainImageDisplay
Copyright © 2023 Central Laboratory of the Research Councils. All Rights Reserved.