Arquitectura de spmkit¶
spmkit separa estrictamente el backend (núcleo de análisis) de las capas de presentación (CLI y GUI). El objetivo es que el análisis sea reutilizable, testeable y que la lógica científica viva en un solo lugar.
Regla de dependencias¶
core/no importa nada decli/nigui/.cli/ygui/importan solo la API pública decore/.cli/ygui/nunca importan parsers ni implementan análisis: orquestan.
Flujo de datos¶
flowchart LR
F[".nid / .nhf"] --> IO["core.io.load()"]
IO --> D["SPMData\n(SPMChannel[])"]
D --> A["core.analysis\nleveling · roughness\nprofiles · kpfm · mechanics"]
A --> R["*Result / Profile"]
R --> E["core.export\ncsv · json · hdf5"]
D -. presenta .-> CLI["cli (typer+rich)"]
D -. presenta .-> GUI["gui (PyQt6+pyqtgraph)"]
R -. presenta .-> CLI
R -. presenta .-> GUI
Sub-capas del core¶
| Módulo | Responsabilidad | Entrada → Salida |
|---|---|---|
core.io |
Leer formatos del instrumento | ruta → SPMData |
core.models |
Modelos de dominio (inmutables) | — |
core.analysis |
Cálculo numérico | SPMChannel → *Result |
core.export |
Serializar a formatos abiertos | resultado → archivo |
Modelos (core.models)¶
SPMChannel— un canal 2D en unidades físicas:data(ndarray),unit,x_range/y_range(m),direction,group,metadata.SPMData— colección de canales + metadatos del barrido. Acceso por nombre:data["Z-Axis"], con selección de dirección (forward/backward).
Contrato público¶
from spmkit import load # core.io.load
from spmkit.core.analysis import (
leveling, roughness, profiles, kpfm, mechanics
)
from spmkit.core.export import to_csv, to_hdf5, to_json
Formato NanoSurf .nid (notas de implementación)¶
- Header de texto UTF-8 tipo INI (con respaldo latin-1).
- Marcador binario
#!(2 bytes) separa header de datos. - Bloques binarios por canal, en el orden de
[DataSet] GrN-ChM. - Cada muestra:
SaveBits/SaveSign/SaveOrder→ típicamente int32 LE. - Conversión a físico:
phys = Dim2Min + (raw + 2^(b-1)) / 2^b * Dim2Range.
Decisiones de diseño¶
- uv + hatchling: gestor moderno + build backend estándar (no setuptools legacy).
- PyQt6 + pyqtgraph para la GUI: render acelerado de imágenes y perfiles interactivos, superior a soluciones web para visualización científica densa.
- Dataclasses inmutables en el dominio: resultados reproducibles y fáciles de serializar.
- Extras opcionales (
hdf5,gui): el núcleo se instala ligero; las dependencias pesadas son opt-in.