Файл данных собственного формата Gwyddion (GWY) состоит из древовидной структуры объектов, переведённых в последовательный вид. В общем случае эти объекты могут быть различного вида и включать в себя другие объекты (вследствие древовидной структуры). В понимании работы может сильно помочь gwydump, простой демонстратор структуры файла, который доступен на сайте проекта, если с ним поработать какое-то время и посмотреть содержимое различных файлов. Если вы планируете читать и/или писать файлы GWY в другом программном обеспечении, можно также взглянуть на libgwyfile, небольшую самостоятельную встраиваемую библиотеку для работы с файлами GWY.
Это описание формата файла задаёт на самом деле две различные вещи, которые иногда полезно различать:
Обычно должно быть достаточно понятно, когда мы говорим об общем формате, и когда о специфичных для Gwyddion объектах данных (иногда это будет явно указано). Мы начнём с физической структуры файла.
Все данные хранятся в формате младший байт сначала (little-endian, также известный как LSB или Intel).
Заголовок файла состоит из четырёх байтов (магическое число) со значениями символов ASCII GWYP
.
Это новый формат файла, также существует более старая версия формата с заголовком GWYO
. Она не будет здесь обсуждаться, поскольку в настоящее время практически перестала использоваться.
Остальная часть файла Gwyddion состоит из переведённых в последовательную форму (сериализованных) объектов GwyContainer, которые содержат все данные. Они сохраняются точно так же, как и любые другие объекты, что описано в следующей секции.
В общем случае файл GWY может содержать какой-то другой объект в качестве объекта верхнего уровня.
Объект состоит из трёх частей (в следующем порядке):
NUL
строки символов ASCII. Это имя типа в системе типов GObject. В общем случае имя должно быть правильным идентификатором языка C.Число компонент в явном виде не хранится, оно подразумевается общим размером данных, переведённых в последовательную форму. Компоненты занимают вместе ровно столько байтов, выравнивание не используется.
Каждый компонент состоит из трёх частей (в следующем порядке):
NUL
строки в кодировке UTF-8.Компоненты нередко называются элементы (items) в libgwyfile и библиотеках Gwyddion.
Размер компонента не представлен в явном виде – он задается его типом данных и содержимым. Пропуск неизвестного (или не интересующего нас) компонента в процессе чтения файла GWY может быть реализован тем, что сначала читается имя компонента и его тип. После это есть несколько возможных сценариев:
NUL
.NUL
) в соответствии с длиной массива.Доступные атомарные типы данных приведены в нижеследующей таблице:
Тип | Символ | Размер | Примечание |
---|---|---|---|
булев | b | 1 байт | Ноль это false, не ноль (обычно 1) это true |
символ | c | 1 байт | |
32битное целое | i | 4 байта | |
64битное целое | q | 8 байт | |
вещественное двойной точности | d | 8 байт | Конечное число с плавающей точкой двойной точности по стандарту IEEE 754, т.е. файлы не должны содержать бесконечных чисел и нечисловых значений (NaN). |
строка | s | переменный | NUL -завершенная и кодированная в UTF-8 |
объект | o | переменный | Вложенный переведённый в последовательную форму объект, как описано выше |
Каждый атомарный тип, кроме булевого (boolean) имеет своего двойника в виде массива. Символ типа для всех массивов тот же, что и для атомарного типа, только он написан в верхнем регистре. Массивы хранятся как 32-битная длина массива без знака (число элементов), затем значения элементов. Число элементов должно быть положительным, пустые массивы не сохраняются. Список типов данных для массивов приведён в следующей таблице:
Тип | Символ | Примечание |
---|---|---|
массив символов | C | В общем случае ни NUL -завершенная, ни кодированная в UTF-8 (s используется для текстовых строк). |
массив 32битных целых | I | |
массив 64битных целых | Q | |
массив вещественных чисел двойной точности | D | |
массив строк | S | |
массив объектов | O | Буква O в верхнем регистре, не ноль |
GwyContainer это общий похожий на словарь объект данных который может содержать произвольные компоненты произвольных типов. Это позволяет достаточно разумно включать непредусмотренные заранее структуры данных в файлы GWY.
Имена (ключи) объектов в GwyContainer, представляющем файл Gwyddion GWY сильно напоминают имена файлов в UNIX, т.е. они записываются в виде разделённых символом /
путей и образуют похожую на древовидную структуру. Например, название первого изображения, под номером 0, сохраняется с ключом /0/data/title
. Следует отметить, что некоторые данные и дополнительная информация сохраняются под ключами с нелогичными названиями, обычно это происходит по историческим причинам.
Следующие разделы описывают организацию интересующик нас данных и информации в GwyContainer верхнего уровня. Этот список не обязательно будет полным. Однако, поскольку все элементы данных в файле единообразно указывают свои имена, тип и размер в байтах всегда можно пропустить неизвестные типы данных или те типы данных, которые не нужны, и извлекать только требуемые.
Следующая таблица содержит общие ключи данных, относящихся к изображениям в контейнере верхнего уровня для изображения номер 0. Для других изображений число 0 должно быть заменено на соответствующий номер изображения. Следует отметить, что изображения нередко нумеруются последовательно начиная с 0. Однако, они могут иметь любые номера и множество номеров изображений не обязательно должно быть последовательно и непрерывно.
Ключ | Тип | Значение |
---|---|---|
/0/data | GwyDataField | Данные канала. |
/0/data/title | строка | Имя канала, как оно показывается в просмотре данных |
/0/data/visible | булев | Должно ли изображение показываться в окне при открытии файла данных |
/0/data/realsquare | булев | Должно ли изображение показываться в окне в режиме Равные масштабы осей (или, наоборот, в режиме Квадратные пиксели). |
/0/base/palette | строка | Имя градиента псевдоцвета используемого при отображении изображения. |
/0/base/range-type | 32битное целое | Тип отображения псевдоцвета (как задано инструментом «диапазон псевдоцвета»), значение из множества GwyLayerBasicRangeType. |
/0/base/min | вещественное двойной точности | Минимальное значение для заданного пользователем отображаемого диапазона. |
/0/base/max | вещественное двойной точности | Максимальное значение для заданного пользователем отображаемого диапазона. |
/0/mask | GwyDataField | Данные маски. Размеры в пикселях этого поля данных должны соответствовать данным изображения. |
/0/mask/red | вещественное двойной точности | Красный компонент цвета маски. |
/0/mask/green | вещественное двойной точности | Зелёный компонент цвета маски. |
/0/mask/blue | вещественное двойной точности | Синий компонент цвета маски. |
/0/mask/alpha | вещественное двойной точности | Компонент Alpha (прозрачность) цвета маски. |
/0/show | GwyDataField | Данные презентации. Размеры в пикселях этого поля данных должны соответствовать данным изображения. |
/0/meta | GwyContainer | Метаданные канала. Ключи это имена, которые будут отображаться в окне просмотра метаданных, строковые значения – значения данных. |
/0/data/log | GwyStringList | Журнал работы с каналом. Он имеет формат . |
/0/select/ | подкласс GwySelection | Данные выделенных объектов. Каждый тип выделения имеет (обычно) отдельный тип объекта и сохраняется под отдельным именем; конкретное имя foo будет тем же, что показано в менеджер выделенного. |
Каналы представлены как объекты GwyDataField. Компоненты GwyDataField представлены в следующей таблице:
Компонент | Тип | Значение |
---|---|---|
xres | 32битное целое | Горизонтальный размер в пикселях. |
yres | 32битное целое | Вертикальный размер в пикселях. |
xreal | вещественное двойной точности | Горизонтальный размер в физических единицах. |
yreal | вещественное двойной точности | Вертикальный размер в физических единицах. |
xoff | вещественное двойной точности | Горизонтальное смещение верхнего левого угла в физических единицах. Обычно записывается только если не равно нулю. |
yoff | вещественное двойной точности | Вертикальное смещение верхнего левого угла в физических единицах. Обычно записывается только если не равно нулю. |
si_unit_xy | GwySIUnit | Единица измерения горизонтальных размеров. |
si_unit_z | GwySIUnit | Единица измерения значений данных. |
data | массив вещественных чисел двойной точности | Данные поля, сохранённые как плоский массив размера xres ×yres , сверху вниз и слева направо. |
Следующая таблица содержит общие ключи данных, относящихся к графикам в контейнере верхнего уровня для графика номер 1. Для других графиков число 1 должно быть заменено на соответствующий номер графика. Следует отметить, что графики нередко нумеруются последовательно начиная с единицы, но они могут иметь любые положительные номера, не обязательно последовательные. Число 0 в префиксе номеров графика является историческим артефактом, ничего сейчас не значит и всегда должно быть 0.
Ключ | Тип | Значение |
---|---|---|
/0/graph/graph/1 | GwyGraphModel | Данные объекта Graph model |
/0/graph/graph/1/visible | булев | Должен ли график отображаться при открытии файла. |
Графики представлены как объекты GwyGraphModel. Компоненты GwyGraphModel сведены в следующую таблицу:
Компонент | Тип | Значение |
---|---|---|
curves | массив из GwyGraphCurveModel | Отдельные кривые графиков. |
title | строка | Название графика как оно отображается в окне просмотра данных. |
x_unit | GwySIUnit | Единицы абсциссы. |
y_unit | GwySIUnit | Единицы ординаты. |
top_label | строка | Подпись верхней оси. |
bottom_label | строка | Подпись нижней оси. |
left_label | строка | Подпись левой оси. |
right_label | строка | Подпись правой оси. |
x_is_logarithmic | булев | Логарифмический масштаб абсциссы. |
y_is_logarithmic | булев | Логарифмический масштаб ординаты. |
x_min | вещественное двойной точности | Заданное пользователем минимальное значение абсциссы. |
x_min_set | булев | Нужно ли использовать заданное пользователем минимальное значение абсциссы (или диапазон определяется автоматически). |
x_max | вещественное двойной точности | Заданное пользователем максимальное значение абсциссы. |
x_max_set | булев | Нужно ли использовать заданное пользователем максимальное значение абсциссы (или диапазон определяется автоматически). |
y_min | вещественное двойной точности | Заданное пользователем минимальное значение ординаты. |
y_min_set | булев | Нужно ли использовать заданное пользователем минимальное значение ординаты (или диапазон определяется автоматически). |
y_max | вещественное двойной точности | Заданное пользователем максимальное значение ординаты. |
y_max_set | булев | Нужно ли использовать заданное пользователем максимальное значение ординаты (или диапазон определяется автоматически). |
grid-type | 32битное целое | Тип отображаемой сетки. Значение из множества GwyGraphGridType. |
label.has_frame | булев | Отображать рамку вокруг легенды. |
label.frame_thickness | 32битное целое | Толщина рамки легенды. |
label.reverse | булев | Отображать легенду в обратном порядке. |
label.visible | булев | нужно ли отображать легенду. |
label.position | 32битное целое | Расположение (угол) в котором будет помещена легенда. Значение из множества GwyGraphLabelPosition. |
Кривые графиков представлены как объекты GwyGraphCurveModel. Компоненты GwyGraphCurveModel сведены в следующую таблицу:
Компонент | Тип | Значение |
---|---|---|
xdata | массив вещественных чисел двойной точности | Точки абсциссы. Число точек должно соответствовать ydata . |
ydata | массив вещественных чисел двойной точности | Точки ординаты. Число точек должно соответствовать xdata . |
description | строка | Описание кривой (имя). |
тип | 32битное целое | Режим отображения кривой (точки, линии и т.п.) Значение из множества GwyGraphCurveType. |
color.red | вещественное двойной точности | Красный компонент цвета кривой. |
color.green | вещественное двойной точности | Зелёный компонент цвета кривой. |
color.blue | вещественное двойной точности | Синий компонент цвета кривой. |
point_type | 32битное целое | Тип символов, представляющих точки данных. Значение из множества GwyGraphPointType. |
point_size | 32битное целое | Размер символов, представляющих точки данных. |
line_type | 32битное целое | Тип линий, соединяющих точки данных. Значение из множества GwyGraphLineType. |
line_size | 32битное целое | Толщина линии, соединяющей точки данных. |
Следующая таблица содержит общие ключи данных, относящихся к спектроскопии в контейнере верхнего уровня для набора спектров номер 0. Для других спектров число 0 надо заменить соответствующим номером набора спектров. Следует отметить. что наборы спектров нередко нумеруются последовательно начиная с 0, хотя они могут иметь любые номера, которые не обязательно должны идти последовательно.
Ключ | Тип | Значение |
---|---|---|
/sps/0 | GwySpectra | Данные спектроскопии. |
Наборы спектров одного типа представлены как объекты GwySpectra. Компоненты GwySpectra сведены в следующую таблицу:
Компонент | Тип | Значение |
---|---|---|
title | строка | Название спектров как оно отображается в окне просмотра данных. |
si_unit_xy | GwySIUnit | Единицы измерения координат места, где снимались спектры. |
coords | массив вещественных чисел двойной точности | Координаты точек, где снимались спектры, в физических единицах. Каждый спектр занимает два элемента: горизонтальную и вертикальную координату. Количество координат должно соответствовать числу кривых в data . |
data | массив из GwyDataLine | Отдельные кривые спектров. |
selected | массив 32битных целых | Индексы выбранных кривых спектров. |
Отдельные кривые в спектрах представлены как объекты GwyDataLine. Объект GwyDataLine является одномерным аналогом GwyDataField и используется также для других одномерных данных. Компоненты GwyDataLine сведены в следующую таблицу:
Компонент | Тип | Значение |
---|---|---|
res | 32битное целое | Число точек данных. |
real | вещественное двойной точности | Длина в физических единицах. |
off | вещественное двойной точности | Смещение начала в физических единицах. Обычно записывается только если не равно нулю. |
si_unit_x | GwySIUnit | Единицы измерения абсциссы. |
si_unit_y | GwySIUnit | Единица измерения значений данных. |
data | массив вещественных чисел двойной точности | Данные линии, сохранённые как массив res , слева направо . |
Следующая таблица сводит воедино общие ключи для объёмных данных в контейнере верхнего уровня для объёмных данных с номером 0. Для других объёмных данных, число 0 должно быть заменено соответствующим номером объёмных данных. Следует отметить, что объёмные данные обычно нумеруются последовательно, начиная с 0, однако, они могут иметь любые номера и множество номеров объёмных данных не обязательно должно быть непрерывным.
Ключ | Тип | Значение |
---|---|---|
/brick/0 | GwyBrick | Объёмные данные. |
/brick/0/preview | GwyDataField | Двумерные данные, демонстрируемые при показе объёмных данных в окне. |
/brick/0/title | строка | Имя объёмных данных, как оно показывается в браузере данных |
/brick/0/visible | булев | Следует ли отображать объёмные данные в окне при загрузке файлов. |
/brick/0/preview/palette | строка | Имя градиента псевдоцвета используемого при отображении изображения предпросмотра. |
/brick/0/meta | GwyContainer | Метаданные объёмных данных. Ключи это имена, которые будут отображаться в окне просмотра метаданных, строковые значения – значения данных. |
/brick/0/log | GwyStringList | Журнал работы с объёмными данными. Он имеет формат . |
Объёмные данные представлены как объекты GwyBrick. Компоненты GwyBrick представлены в следующей таблице:
Компонент | Тип | Значение |
---|---|---|
xres | 32битное целое | Горизонтальный размер в пикселях. |
yres | 32битное целое | Вертикальный размер в пикселях. |
zres | 32битное целое | Глубина (число уровней) в пикселях. |
xreal | вещественное двойной точности | Горизонтальный размер в физических единицах. |
yreal | вещественное двойной точности | Вертикальный размер в физических единицах. |
zreal | вещественное двойной точности | Размер глубины в физических единицах. |
xoff | вещественное двойной точности | Горизонтальное смещение верхнего левого угла в физических единицах. Обычно записывается только если не равно нулю. |
yoff | вещественное двойной точности | Вертикальное смещение верхнего левого угла в физических единицах. Обычно записывается только если не равно нулю. |
zoff | вещественное двойной точности | Смещение по глубине верхнего левого угла в физических единицах. Обычно записывается только если не равно нулю. |
si_unit_x | GwySIUnit | Единица измерения горизонтальных размеров. |
si_unit_y | GwySIUnit | Единица измерения вертикальных пространственных размеров. |
si_unit_z | GwySIUnit | Единица измерения размеров по глубине. |
si_unit_w | GwySIUnit | Единица измерения значений данных. |
data | массив вещественных чисел двойной точности | Данные поля, сохранённые как плоский массив размера xres ×yres ×zres , с нулевой до последней плоскости, сверху вниз и слева направо. |
calibration | GwyDataLine | Калибровка оси z, представляющая нелинейные отсчёты шкалы в этом направлении. Число точек должно быть равно zres . Этот компонент присутствует только если используется нелинейная дискретизация вдоль этой оси. |
Следующая таблица сводит воедино общие ключи для данных XYZ в контейнере верхнего уровня для таких данных с номером 0. Для других данных XYZ, число 0 должно быть заменено соответствующим номером блока такого типа данных. Следует отметить, что данные XYZ обычно нумеруются последовательно, начиная с 0, однако, они могут иметь любые номера и множество номеров блоков данных не обязательно должно быть непрерывным.
Ключ | Тип | Значение |
---|---|---|
/xyz/0 | GwySurface | Данные XYZ. |
/xyz/0/preview | GwyDataField | Растеризованное изображение предпросомтра которое показывается при отображении данных XYZ в окне. Следует отметить, что хотя изображения предпросмотра сохраняются в файлах GWY, они обычно являются создаётся заново и обновляется при показе данных так что добавлять их при записи файла GWY редко будет полезным занятием. |
/xyz/0/title | строка | Имя данных XYZ, как оно показывается в окне браузера данных. |
/xyz/0/visible | булев | Следует ли отображать данные XYZ в окне при загрузке файлов. |
/xyz/0/preview/palette | строка | Имя градиента псевдоцвета используемого при отображении изображения предпросмотра. |
/xyz/0/meta | GwyContainer | Метаданные данных XYZ. Ключи это имена, которые будут отображаться в окне просмотра метаданных, строковые значения – значения данных. |
/xyz/0/log | GwyStringList | Журнал работы с объёмными данными. Он имеет формат . |
Данные XYZ представлены как объекты GwySurface. Компоненты GwySurface представлены в следующей таблице:
Компонент | Тип | Значение |
---|---|---|
si_unit_xy | GwySIUnit | Единица измерения горизонтальных размеров. |
si_unit_z | GwySIUnit | Единица измерения значений данных. |
data | массив вещественных чисел двойной точности | Данные XYZ, сохранённые как плоский массив с длиной кратной 3. Каждый триплет XYZ сохраняется вместе, что приводит к следующему порядку следования данных: x ₀, y ₀, z ₀, x ₁, y ₁, z ₁, x ₂, y ₂, z ₂, и т.д. |
Следующая таблица обобщает общие ключи для данных, относящихся к карте кривых в контейнере верхнего уровня для элемента данных номер 0. Для других карт кривых, номер 0 нужно заменить на соответствующий номер карты кривых. Следует отметить, что карты кривых обычно нумеруются последовательно, начиная с 0, однако, они могут иметь любые индексы и множество номеров карт кривых не обязательно должно быть непрерывным.
Ключ | Тип | Значение |
---|---|---|
/lawn/0 | GwyLawn | Данные карты кривых. |
/lawn/0/preview | GwyDataField | Изображение предпросмотра, которое отображается когда данные карты кривых показываются в окне. |
/lawn/0/title | строка | Имя данных XYZ, как оно показывается в окне браузера данных. |
/lawn/0/visible | булев | Следует ли отображать данные XYZ в окне при загрузке файлов. |
/lawn/0/preview/palette | строка | Имя градиента псевдоцвета используемого при отображении изображения предпросмотра. |
/lawn/0/preview/realsquare | булев | Должно ли изображение показываться в окне в режиме Равные масштабы осей (или, наоборот, в режиме Квадратные пиксели). |
/lawn/0/meta | GwyContainer | Метаданные карты кривых. Ключи это имена, которые будут отображаться в окне просмотра метаданных, строковые значения – значения данных. |
/lawn/0/log | GwyStringList | Журнал работы с объёмными данными. Он имеет формат . |
Данные карты кривых представлены как объекты GwyLawn. Компоненты type>GwyLawn
Компонент | Тип | Значение |
---|---|---|
xres | 32битное целое | Горизонтальный размер в пикселях. |
yres | 32битное целое | Вертикальный размер в пикселях. |
ncurves | 32битное целое | Количество кривых в каждом пикселе. |
curvelengths | массив 32битных целых | Массив размером xres × yres содержащий количество отсчётов в каждом пикселе (в обычном для изображений порядке). Количество отсчётов может быть нулевым. |
xreal | вещественное двойной точности | Горизонтальный размер в физических единицах. |
yreal | вещественное двойной точности | Вертикальный размер в физических единицах. |
xoff | вещественное двойной точности | Горизонтальное смещение верхнего левого угла в физических единицах. Обычно записывается только если не равно нулю. |
yoff | вещественное двойной точности | Вертикальное смещение верхнего левого угла в физических единицах. Обычно записывается только если не равно нулю. |
si_unit_xy | GwySIUnit | Единица измерения горизонтальных размеров. |
si_units_curves | массив объектов GwySIUnit | Единицы измерения данных кривых, как массив с ncurves элементов. |
data | массив вещественных чисел двойной точности | Объединенные данные кривых, сохраненные как плоский массив, размер которого кратен числу кривых (ncurves ). Данные сохраняются в обычном для изображений порядке. Сначала объединяются и сохраняются все кривые в верхнем левом пикселе, затем все в следующем пикселе справа и т.д. Чтение и запись этого элемента требует использовать curvelengths для правильной индексации. |
curve_labels | массив строк | Опциональный массив с числом элементов ncurves задающий метки кривых. |
nsegments | 32битное целое | Число сегментов, на которые будет разбита каждая из кривых – если кривые делятся на сегменты. В этом случае элемент segments должен задавать сегментацию. |
segments | массив 32битных целых | Сегментация каждой кривой, задаваемая как стартовый и конечный индекс для каждого сегмента в каждой кривой. Размер массива xres × yres × 2nsegments . Сегменты не должны точно делить кривую, они могут пересекаться и между ними могут быть неиспользуемые части кривой. |
segment_labels | массив строк | Опциональный массив с числом элементов nsegments задающий метки сегментов. |
Основной GwyContainer также содержит элементы, которые не относятся ни к одному из отдельных каналов, графиков или данных других типов.
Ключ | Тип | Значение |
---|---|---|
/filename | строка | Имя файла, с которым GwyContainer в данный момент связан. Если он был сохранён в файл, то этот элемент содержит соответствующее имя файла. В противном случае данный элемент содержит имя файла, из которого данные были загружены или импортированы. Элемент может быть не задан, например, в случае только что созданных синтетических данных. |
Компоненты GwySIUnit представлены в следующей таблице:
Компонент | Тип | Значение |
---|---|---|
unitstr | строка | Текстовое представление единицы измерения, например, "A" или "m^-1" (как базовые единицы СИ, префиксы игнорируются). |
Компоненты GwySelection сведены в следующую таблицу. Некоторые типы выделенного могут содержать другие элементы данных; обратитесь к документации к конкретному типу выделенного о том, как интерпретировать данные.
Компонент | Тип | Значение |
---|---|---|
max | 32битное целое | Максимальное число объектов. которое может быть в выделенном (число, установленное gwy_selection_set_max_objects() ). |
data | массив вещественных чисел двойной точности | Данные выделения. Число элементов, которые формируют один объект выделения определяется типом выбранного. |
Компоненты типа GwyStringList сведены в следующую таблицу. Если GwyStringList используется для представления журнала, строки будут иметь определённую структуру, описанную выше.