Advanced Usage

Grouping AFM data

AFM data can be organized in an afmformats.AFMGroup which comes with a few user-convenient functionalities:

In [1]: import afmformats

In [2]: group = afmformats.AFMGroup("data/force-map2x2-example.jpk-force-map")

# group contains all curves in the data file
In [3]: print(group)
AFMGroup: 'data/force-map2x2-example.jpk-force-map'
- AFMForceDistance 'data/force-map2x2-example.jpk-force-map'[0]
- AFMForceDistance 'data/force-map2x2-example.jpk-force-map'[1]
- AFMForceDistance 'data/force-map2x2-example.jpk-force-map'[2]
- AFMForceDistance 'data/force-map2x2-example.jpk-force-map'[3]

# you may add other data files to groups
In [4]: group += afmformats.load_data("data/force-save-example.jpk-force")

In [5]: print(group)
AFMGroup: 'None'
- AFMForceDistance 'data/force-map2x2-example.jpk-force-map'[0]
- AFMForceDistance 'data/force-map2x2-example.jpk-force-map'[1]
- AFMForceDistance 'data/force-map2x2-example.jpk-force-map'[2]
- AFMForceDistance 'data/force-map2x2-example.jpk-force-map'[3]
- AFMForceDistance 'data/force-save-example.jpk-force'[0]

# You can also extract a subgroup that matches a certin path
In [6]: subgroup = group.subgroup_with_path("data/force-map2x2-example.jpk-force-map")

In [7]: print(subgroup)
AFMGroup: 'data/force-map2x2-example.jpk-force-map'
- AFMForceDistance 'data/force-map2x2-example.jpk-force-map'[0]
- AFMForceDistance 'data/force-map2x2-example.jpk-force-map'[1]
- AFMForceDistance 'data/force-map2x2-example.jpk-force-map'[2]
- AFMForceDistance 'data/force-map2x2-example.jpk-force-map'[3]

Logging (for developers)

afmformats has a simple logging system. When loading data in a script or in the console, debug-level logs can be written to afmformats.log in your machine’s temp folder if you call afmformats.configure_logging(). When running tests via pytest, the logs will be written to a temp directory as defined in tests.conftest.pytest_configure().

import pathlib
import afmformats

data_path = pathlib.Path("tests/data")

# write logs to tmp/afmformats.log
afmformats.configure_logging()

afmformats.load_data(data_path / "fmt-hdf5-fd_version_0.13.3.h5")

If you would like the logs also to be output to the terminal when running scripts you can set the logging level:

import pathlib
import afmformats
import logging

data_path = pathlib.Path("tests/data")

# write logs to tmp/afmformats.log and to terminal
afmformats.configure_logging(console_logging_level=logging.DEBUG)

afmformats.load_data(data_path / "fmt-hdf5-fd_version_0.13.3.h5")

Output of the above script:

DEBUG:afmformats.formats:Loaded 1 dataset(s) from '...\afmformats\tests\data\fmt-hdf5-fd_version_0.13.3.h5' using 'HDF5-based'
Process finished with exit code 0