Формат файлов Gwyddion

Родные для Gwyddion файлы данных состоят из древоподобной структуры сериализованных объектов. В общем случае эти объекты могут быть различного вида и включать в себя другие объекты (вследствие древовидной структуры). В понимании работы может сильно помочь gwydump, простой демонстратор структуры файла, который доступен на сайте проекта, если с ним поработать какое-то время и посмотреть содержимое различных файлов.

Прежде всего, мы описываем физическую структуру файла безотносительно возможной интерпретации содержимого.

Порядок байтов

Все данные хранятся в формате младший сначала (little-endian, также известном, как LSB или Intel).

Заголовок файла

Заголовок файла состоит из четырёх байтов (магическое число) со значениями символов ASCII GWYP.

Это новый формат файла, также существует более старая версия формата с заголовком GWYO. Она не будет обсуждаться здесь.

Данные файла

Остальная часть файла состоит из переведённых в последовательную форму (сериализованных) объектов GwyContainer, которые содержат все данные. Они сохраняются точно так же, как и любые другие объекты, что описано в следующей секции.

Размещение объекта

Объект состоит из трёх частей (в следующем порядке):

  • Имя типа, сохранённое в виде завершенной NUL строки символов ASCII. Это имя типа в системе типов GObject.
  • Размер переведённых в последовательную форму данных в виде 32-битного целого без знака. Не включает в себя размер имени типа и размер себя.
  • Список компонентов. Компонентами называются поименованные части данных объекта, каждая определённого типа данных: атомарного типа, массива атомарных типов или ещё одного объекта. Они сохраняются без определённого порядка.

Компоненты

Каждый компонент состоит из трёх частей (в следующем порядке):

  • Имя, сохраненное в виде завершенной NUL строки.
  • Тип, сохранённый как один байт без знака (символ). Таблица возможных типов компонентов приведена ниже.
  • Данные, сохранённые в формате, который подходит для определённого типа.

Типы данных

Доступные атомарные типы данных приведены в нижеследующей таблице:

ТипСимволПримечание
булевbСохраняется как байт, ноль = false, не ноль (обычно 1) = true
символc 
32битное целоеi 
64битное целоеq 
doubledконечное число с плавающей точкой двойной точности по стандарту IEEE 754, т.е. файлы не должны содержать бесконечных чисел и не числовых значений (NaN).
строкаsNUL-завершенная
объектoПереведённый в последовательную форму объект, как описано выше

Каждый атомарный тип, кроме булевого (boolean) имеет своего двойника в виде массива. Символ типа для всех массивов тот же, что и для атомарного типа, только он написан в верхнем регистре. Массивы хранятся как 32-битная длина массива без знака (число элементов), затем значения элементов. Список типов данных для массивов приведён ниже:

ТипСимволПримечание
массив символовCНе NUL-завершенный
массив 32битных целыхI 
массив 64битных целыхQ 
массив doubleD 
массив строкS 
массив объектовOБуква O в верхнем регистре, не ноль

GwyContainer верхнего уровня

Имена (ключи) объектов в GwyContainer, представленные в файле Gwyddion сильно напоминают имена файлов в UNIX, т.е. они записываются в виде разделённых / путей и образуют древовидную структуру. Например, название первого канала, под номером 0, сохраняется под ключом /0/data/title. Следует отметить, что некоторые данные и дополнительная информация сохраняются под ключами с нелогичными названиями, обычно это происходит по историческим причинам.

Следующие разделы описывают организацию интересующик нас данных и информации в GwyContainer. Этот список не обязательно будет полным. Однако, поскольку все элементы данных в файле единообразно указывают свои имена, тип и размер в байтах всегда можно пропустить неизвестные типы данных или те типы данных, что не нужны, и извлекать только требуемые.

Каналы

Следующая таблица содержит общие ключи данных, относящихся к каналам в контейнере верхнего уровня для канала номер 0. Для других каналов число 0 должно быть заменено на соответствующий номер канала. Следует отметить, что каналы нередко нумеруются последовательно начиная с 0, однако, они могут иметь любые номера и множество номеров каналов не обязательно должно быть последовательно и непрерывно.

КлючТипЗначение
/0/dataGwyDataFieldДанные канала.
/0/data/titleстрокаИмя канала, как оно показывается в просмотре данных
/0/data/visibleбулевДолжен ли канал показываться в окне при открытии файла данных
/0/base/paletteстрокаИмя градиента псевдоцвета используемого при отображении канала.
/0/base/range-type32битное целоеТип отображения псевдоцвета (как задано инструментом «диапазон псевдоцвета»), значение из множества GwyLayerBasicRangeType.
/0/base/mindoubleМинимальное значение для заданного пользователем отображаемого диапазона.
/0/base/maxdoubleМаксимальное значение для заданного пользователем отображаемого диапазона.
/0/maskGwyDataFieldДанные маски. Размеры в пикселях этого поля данных должны соответствовать данным канала.
/0/mask/reddoubleКрасный компонент цвета маски.
/0/mask/greendoubleЗелёный компонент цвета маски.
/0/mask/bluedoubleСиний компонент цвета маски.
/0/mask/alphadoubleКомпонент Alpha (прозрачность) цвета маски.
/0/showGwyDataFieldДанные презентации. Размеры в пикселях этого поля данных должны соответствовать данным канала.
/0/metaGwyContainerМетаданные канала. Ключи это имена, которые будут отображаться в окне просмотра метаданных, строковые значения – значения данных.
/0/select/fooподкласс GwySelectionДанные выделения. Каждый тип выделения имеет (обычно) отдельный тип объекта и сохраняется под отдельным именем; конкретное имя foo будет тем же, что показано в менеджер выделенного.

Каналы представлены как объекты GwyDataField. Компоненты GwyDataField представлены в следующей таблице:

КомпонентТипЗначение
xres32битное целоеГоризонтальный размер в пикселях.
yres32битное целоеВертикальный размер в пикселях.
xrealdoubleГоризонтальный размер в физических единицах.
yrealdoubleВертикальный размер в физических единицах.
xoffdoubleГоризонтальное смещение верхнего левого угла в физических единицах. Обычно записывается только если не равно нулю.
yoffdoubleВертикальное смещение верхнего левого угла в физических единицах. Обычно записывается только если не равно нулю.
si_unit_xyGwySIUnitЕдиница измерения горизонтальных размеров.
si_unit_zGwySIUnitЕдиница измерения значений данных.
dataмассив doubleДанные поля, сохранённые как плоский массив размера xres×yres, сверху вниз и слева направо.

Графики

Следующая таблица содержит общие ключи данных, относящихся к графикам в контейнере верхнего уровня для графика номер 1. Для других графиков число 1 должно быть заменено на соответствующий номер графика. Следует отметить, что графики нередко нумеруются последовательно начиная с единицы, но они могут иметь любые положительные номера, не обязательно последовательные. Число 0 в префиксе номеров графика является историческим артефактом, ничего сейчас не значит и всегда должно быть 0.

КлючТипЗначение
/0/graph/graph/1GwyGraphModelДанные объекта Graph model
/0/graph/graph/1/visibleбулевДолжен ли график отображаться при открытии файла.

Графики представлены как объекты GwyGraphModel. Компоненты GwyGraphModel сведены в следующую таблицу:

КомпонентТипЗначение
curvesмассив GwyGraphCurveModelОтдельные кривые графиков.
titleстрокаНазвание графика как оно отображается в окне просмотра данных.
x_unitGwySIUnitЕдиницы абсциссы.
y_unitGwySIUnitЕдиницы ординаты.
top_labelстрокаПодпись верхней оси.
bottom_labelстрокаПодпись нижней оси.
left_labelстрокаПодпись левой оси.
right_labelстрокаПодпись правой оси.
x_is_logarithmicбулевЛогарифмический масштаб абсциссы.
y_is_logarithmicбулевЛогарифмический масштаб ординаты.
x_mindoubleЗаданное пользователем минимальное значение абсциссы.
x_min_setбулевНужно ли использовать заданное пользователем минимальное значение абсциссы (или диапазон определяется автоматически).
x_maxdoubleЗаданное пользователем максимальное значение абсциссы.
x_max_setбулевНужно ли использовать заданное пользователем максимальное значение абсциссы (или диапазон определяется автоматически).
y_mindoubleЗаданное пользователем минимальное значение ординаты.
y_min_setбулевНужно ли использовать заданное пользователем минимальное значение ординаты (или диапазон определяется автоматически).
y_maxdoubleЗаданное пользователем максимальное значение ординаты.
y_max_setбулевНужно ли использовать заданное пользователем максимальное значение ординаты (или диапазон определяется автоматически).
grid-type32битное целоеТип отображаемой сетки. Значение из множества GwyGraphGridType.
label.has_frameбулевОтображать рамку вокруг легенды.
label.frame_thickness32битное целоеТолщина рамки легенды.
label.reverseбулевОтображать легенду в обратном порядке.
label.visibleбулевнужно ли отображать легенду.
label.position32битное целоеРасположение (угол) в котором будет помещена легенда. Значение из множества GwyGraphLabelPosition.

Кривые графиков представлены как объекты GwyGraphCurveModel. Компоненты GwyGraphCurveModel сведены в следующую таблицу:

КомпонентТипЗначение
xdataмассив doubleТочки абсциссы. Число точек должно соответствовать ydata.
ydataмассив doubleТочки ординаты. Число точек должно соответствовать xdata.
descriptionстрокаОписание кривой (имя).
тип32битное целоеРежим отображения кривой (точки, линии и т.п.) Значение из множества GwyGraphCurveType.
color.reddoubleКрасный компонент цвета кривой.
color.greendoubleЗелёный компонент цвета кривой.
color.bluedoubleСиний компонент цвета кривой.
point_type32битное целоеТип символов, представляющих точки данных. Значение из множества GwyGraphPointType.
point_size32битное целоеРазмер символов, представляющих точки данных.
line_type32битное целоеТип линий, соединяющих точки данных. Значение из множества GwyGraphLineType.
line_size32битное целоеТолщина линии, соединяющей точки данных.

Спектры

Следующая таблица содержит общие ключи данных, относящихся к спектроскопии в контейнере верхнего уровня для набора спектров номер 0. Для других спектров число 0 надо заменить соответствующим номером набора спектров. Следует отметить. что наборы спектров нередко нумеруются последовательно начиная с 0, хотя они могут иметь любые номера, которые не обязательно должны идти последовательно.

КлючТипЗначение
/sps/0GwySpectraДанные спектроскопии.

Наборы спектров одного типа представлены как объекты GwySpectra. Компоненты GwySpectra сведены в следующую таблицу:

КомпонентТипЗначение
titleстрокаНазвание спектров как оно отображается в окне просмотра данных.
si_unit_xyGwySIUnitЕдиницы измерения координат места, где снимались спектры.
coordsмассив doubleКоординаты точек, где снимались спектры, в физических единицах. Каждый спектр занимает два элемента: горизонтальную и вертикальную координату. Количество координат должно соответствовать числу кривых в data.
dataмассив элементов GwyDataLineОтдельные кривые спектров.
selectedмассив 32битных целыхИндексы выбранных кривых спектров.

Отдельные кривые в спектрах представлены как объекты GwyDataLine. Компоненты GwyDataLine сведены в следующую таблицу:

КомпонентТипЗначение
res32битное целоеЧисло точек данных.
realdoubleДлина в физических единицах.
offdoubleСмещение начала в физических единицах. Обычно записывается только если не равно нулю.
si_unit_xGwySIUnitЕдиницы измерения абсциссы.
si_unit_yGwySIUnitЕдиница измерения значений данных.
dataмассив doubleДанные линии, сохранённые как массив res, слева направо .

Вспомогательные объекты

Компоненты GwySIUnit представлены в следующей таблице:

КомпонентТипЗначение
unitstrстрокаТекстовое представление единицы измерения, например, "A" или "m^-1" (как базовые единицы СИ, префиксы игнорируются).

Компоненты GwySelection сведены в следующую таблицу. Некоторые типы выделенного могут содержать другие элементы данных; обратитесь к документации к конкретному типу выделенного о том, как интерпретировать данные.

КомпонентТипЗначение
max32битное целоеМаксимальное число объектов. которое может быть в выделенном (число, установленное gwy_selection_set_max_objects()).
dataмассив doubleДанные выделения. Число элементов, которые формируют один объект выделения определяется типом выбранного.