# Revisión de Plot, SD2 y otros graficadores

La comparación funcional ampliada, las prioridades y los criterios de aceptación están en [PLAN-FUNCIONAL.md](PLAN-FUNCIONAL.md). Esta revisión inicial no significa que esas funciones ya estén implementadas.

Revisión sobre fuentes reales del árbol, 2026-10-08. Se distingue código ya presente, material reutilizado y capacidades propuestas; no se importan dependencias por semejanza de nombre.

## Plot histórico de Simusol

| Pieza revisada | Comparación con Simplot | Decisión |
|---|---|---|
| `perl/lib/Simusol/ParaPlot.pm` | Misma lógica de generación; las diferencias principales son Globales frente a GlobalesSP | Ya incorporada; no sobrescribir |
| `perl/lib/Simusol/SimPlot.pm` | Mismo cuerpo; Simplot agrega versión y POD | Ya incorporada; no duplicar |
| `perl/lib/Simusol/PlotGNU.pm` | Misma organización y funciones; carece de los arreglos recientes de ejecución síncrona, errores e interacción | Conservar el motor de Simplot |
| `perl/lib/Simusol/ArchSimul.pm` | Idéntico al ArchSimul.pm inactivo de Simplot; no al ArchSimulV.pm activo | Recuperar la intención de reconocer tablas simples, no activar esa copia sin pruebas |
| `cuantas_columnas_SIMUL` | Consume el archivo y tiene una separación por espacios de longitud cero; no es una mejora segura sobre el lector activo | Sustituir el reconocimiento por pruebas y lectura explícita de metadatos |
| `PlotGNUMAL.pm` | Rutinas VIE, comandos shell, dependencia de .res y SCEPTRE | Referencia histórica, no código de producción |
| `perl/data/plotgnu.pl` | Otra envoltura, incluye killall y rm mediante shell | No incorporar |
| `perl/scripts/testw.pl`, `tests.sh` y `repite.sh` | Ensayos de rutas/órdenes, no batería autocontenida | Reemplazar con pruebas en temporales |
| `perl/rerun/colectorsimple2*` | Ejemplo adicional con muchas columnas y dos tablas | Incorporar como material de corpus, conservando origen |

El paquete completo se archiva con `svn move` en `simplot/viejos/plot`. Mantiene licencias, documentación y fuentes; no se incluye en `@INC` ni se instala como motor alternativo. Las referencias históricas de otros árboles antiguos no implican dependencia activa del Simplot actual.

El colector recuperado se ejecuta en `tests/colector.t`: 29 columnas, 28 gráficos individuales y 14 paneles (42 PNG). La segunda tabla se conserva como material, pero este PARAPLOT no la solicita como rerun y la prueba no afirma que la dibuje.

## Variantes de desarrollo de Base y Plot

Revisión del 09/10/2026 sobre archivos reales de `siru/dev/Base` y `siru/dev/Plot`, trasladados después a `simplot/viejos/dev/Base` y `simplot/viejos/dev/Plot` con historia SVN. No son copias idénticas de `siru/Base` ni del Plot archivado en `viejos/plot`; no se mezclaron sus contenidos. Los directorios siguen siendo hermanos para conservar la referencia `../Base` del Makefile histórico de Plot.

| Pieza | Aporte observado | Tratamiento |
|---|---|---|
| `dev/Plot/SimPlot.pm` | Mismo código funcional que `lib/SimPlot/SimPlot.pm`; la copia activa agrega versión y POD | No duplicar |
| `dev/Plot/ParaPlot.pm`, `PlotGNU.pm`, `ArchSimul.pm` | Variantes históricas de pedidos, selección, paneles, interacción y lectura | No sustituir el motor actual ni perder sus arreglos |
| `dev/Base/AyudasPP.pm`, `AuxiliaresPP.pm` | Opciones, rutas, archivos y registros; variantes ya presentes en Simplot | No incorporar otra dependencia |
| `dev/Base/AyudasXML.pm`, `Globales.pm` | XML/Dia y estructuras de capas, plantillas y conexiones | Referencia para la entrada desde Dia, no para dibujar tablas |
| `dev/Plot/perl/testunv/colectorsimple2.paraplot` | 38 columnas, nombres con espacios, agrupamiento y superposición de curvas | Candidato de corpus; falta el archivo referenciado `../colectorsimple2.simul`. No sustituirlo por el colector de 29 columnas existente |

Estos paquetes no se cargaron ni ejecutaron durante la revisión. `Globales.pm` busca SCEPTRE al cargarse y aborta si falta; el ejecutable de Plot contiene `killall gnuplot_x11`; `ajustar_uni` usa factores propios y no resuelve los desplazamientos de tempC/tempF. No deben entrar en PERL5LIB ni en la instalación activa. Las conversiones actuales siguen en Tabular2/libunidades/GNU units.

## SD2 del nuevo SCEPTRE

Hay dos versiones: `Nsceptresimusol/sd2` y la posterior `sceptre2novender/SC1-SD2-26131/sd2`. La segunda contiene `simul_input.f90` y `tests/sd2_simul_test.py`; es la referencia principal.

| Capacidad observada | Utilidad para Simplot | Tratamiento |
|---|---|---|
| Lectura de POS4 y conversión a SIMUL | Aprovechar resultados de SCEPTRE sin enlazarlo | Usar conversión externa existente; no duplicar lector binario |
| Reruns como bloques con longitud propia | No mezclar filas ni tiempo de corridas diferentes | Añadir al contrato futuro identidad de bloque, no solo nombre de archivo |
| Expresiones como `$2*2` | Curvas calculadas a partir de columnas | Diseñar expresiones por serie; distinguirlas de `funcion` analítica de x |
| Rechazo de expresiones que mezclan bloques | Evitar sumas entre vectores sin correspondencia | Adoptar como requisito y caso de regresión |
| Pruebas de nombres largos, 12 reruns, precisión, referencias inválidas y EOF | Casos límite que faltaban | Referencia para ampliar el corpus |
| Escritura precisa en la versión nueva | No perder cifras antes de llegar a Gnuplot | Mantener las tablas originales; todo dato derivado debe escribirse con precisión de double |
| Temporales fijos tmp.gpd/tmp.gpi y terminal interactiva | No adecuados para varios procesos ni pruebas sin ventanas | No copiar esta arquitectura |

La versión antigua formateaba las parejas con `es12.4` y codificaba el número de rerun en un dígito. La versión nueva ya tiene pruebas específicas para superar ambos límites: no deben reintroducirse.

Se ejecutó `PYTHONDONTWRITEBYTECODE=1 python3 tests/sd2_simul_test.py` desde `sceptre2novender/SC1-SD2-26131`: las 7 pruebas pasaron. No se modificó SD2 ni se incorporó SCEPTRE como dependencia de Simplot.

## Observable Plot y Plot2

Son los dos proyectos nombrados en `otrosplot`, no el paquete Plot de Simusol.

| Proyecto | Qué aprovechar | Qué no incorporar ahora |
|---|---|---|
| [Observable Plot](https://observablehq.github.io/plot/features/marks) | Separar tablas, series/marcas, escalas, leyendas y paneles en la especificación | No imponer JavaScript ni navegador al motor Perl/Gnuplot |
| [Transformaciones de Observable Plot](https://observablehq.github.io/plot/features/transforms) | Filtro, agrupación y normalización como operaciones explícitas, anteriores al dibujo | No hacer que el dibujante modifique las tablas originales |
| [Plot2 de Michael Wesemann](https://apps.micw.org/apps/plot2/) | Barras de error, ejes logarítmicos/temporales, exportación y transformaciones científicas | No traer una aplicación macOS ni asumir que su código puede copiarse |

Observable Plot publica su [licencia](https://github.com/observablehq/plot/blob/main/LICENSE), permisiva con conservación de avisos. Para Plot2 se consultó la descripción oficial de funciones, no se estableció una licencia de reutilización de fuentes: se extraen requisitos e ideas, no código.

## Nivel de abstracción y D3 en Puyuspa

Hay dos ejes independientes: nivel de abstracción y etapa de la cadena. No se usa el medio o formato de salida para ubicar una herramienta.

1. Generar datos.
2. Procesar datos.
3. Definir qué dibujar.
4. Hacer el dibujo.
5. Representar el dibujo.

| Herramienta | Etapa | Abstracción pertinente |
|---|---|---|
| Siru, SCEPTRE y Calcula | 1 | Modelos, variables y ecuaciones; productores de datos |
| Tabular2 u otros | 2 | Operaciones sobre tablas |
| PARAPLOT | 3 | Pedido gráfico de alto nivel |
| Simplot con Gnuplot | 4 | Realiza el pedido de PARAPLOT: Simplot lo organiza y Gnuplot hace el dibujo |
| D3 en el recorrido de Puyuspa | 5 | Operaciones bajo la interfaz de Puyuspa |
| Visor o impresora | 5 | Interpreta el dibujo recibido; no redefine las variables |
| Observable Plot | 2 (opcional), 3 y 4 | Declarativo en la parte gráfica |
| Matplotlib | 3 y 4 | API de figuras, ejes y objetos |
| Veusz | 2 (opcional), 3 y 4 | Documento y propiedades de componentes |
| Plot2 | 2 (opcional), 3 y 4 | Interfaz de gráficos y macros |

Siru, SCEPTRE y Calcula ocupan la misma etapa de generación de datos, aunque Siru utilice Calcula internamente. La etapa 4 hace el dibujo: Simplot con Gnuplot se considera una unidad en este recorrido, no dos alternativas. Es una etapa posterior al pedido de PARAPLOT (3), no un nivel inferior. La etapa 5 lo representa: D3 dentro de la interfaz de Puyuspa, un visor o una impresora. Un SVG puede ser resultado de 4 y entrada de 5; el formato no sustituye a la etapa. Son papeles dentro de los recorridos considerados, no restricciones universales: D3 también puede intervenir al construir el dibujo y Gnuplot puede abrir una salida interactiva. No se presupone una cadena Gnuplot--D3 en Simplot.

Cubrir más etapas no implica mayor abstracción. Comparamos el dibujo sobre los mismos datos ya preparados; las transformaciones de Observable Plot quedan fuera porque aquí las realizan Tabular2 u otras herramientas.

Ampliación del 09/10/2026. Se compara lo que debe describir el usuario, no la calidad ni la cantidad de prestaciones. PARAPLOT expresa fuentes, variables, series y agrupamientos sin programar cada trazo. La clasificación siguiente es una interpretación de las interfaces documentadas, no una equivalencia de lenguajes.

| Herramienta | Unidad de descripción | Cercanía al nivel de PARAPLOT |
|---|---|---|
| [Observable Plot](https://observablehq.github.io/plot/features/marks) | Datos, marcas, canales, escalas y facetas | Nivel semejante a PARAPLOT como descripción declarativa; más general no significa mayor abstracción |
| [Gnuplot](https://gnuplot.sourceforge.net/docs_6.0/loc69.html) | Columnas, funciones, estilos y paneles mediante órdenes | Instrucciones para realizar el pedido; su etapa posterior a PARAPLOT no establece una jerarquía de abstracción |
| [Matplotlib](https://matplotlib.org/stable/users/explain/quick_start.html) | Figuras, ejes y objetos manipulados desde Python | Generalmente inferior a PARAPLOT para expresar el mismo pedido: requiere programar la figura; sus funciones de trazado son de alto nivel |
| [Veusz](https://veusz.github.io/docs/manual/introduction.html) | Documento jerárquico de gráficos, curvas y ejes | Comparable al configurar la figura, por interfaz visual o scripts |
| [Plot2](https://apps.micw.org/apps/plot2/) | Gráficos y datos mediante interfaz, macros y scripts | Comparable funcionalmente en la interfaz; equivalencia de su lenguaje con PARAPLOT no comprobada |
| [D3](https://d3js.org/what-is-d3) | Escalas, ejes, formas y elementos web combinados con JavaScript | Inferior a PARAPLOT y más elemental que las órdenes de Gnuplot; la aplicación construye la capa de pedidos |

PARAPLOT declara qué variables representar, sus fuentes y agrupamientos; Simplot traduce ese pedido a instrucciones de Gnuplot. Usar Gnuplot directamente implica asumir más decisiones sobre columnas o expresiones, estilos, ejes, paneles y salida, aunque dispone de valores predeterminados. Menor abstracción no significa menor capacidad: permite controlar detalles que PARAPLOT puede no exponer. D3 ofrece piezas web aún más elementales; esta comparación no significa que Simplot ejecute Gnuplot y después D3.

Veusz se aproxima a PARAPLOT al describir una figura, pero expone más detalles al manipular su jerarquía de componentes. Plot2 es comparable en las operaciones de usuario; queda pendiente clasificar su lenguaje de macros. No se impone una escala universal entre interfaces distintas.

La «gramática» de Observable Plot es visual y se expresa mediante su API JavaScript, no mediante un lenguaje textual propio: figuras, marcas, canales, escalas, capas, facetas y transformaciones. El manual incluye un ejemplo de dos líneas que corresponden a A y B contra T. Véanse [figuras y composición](https://observablehq.github.io/plot/features/plots) y [facetas](https://observablehq.github.io/plot/features/facets); las facetas repiten subgráficos según datos, no son cualquier agrupamiento de paneles.

Puyuspa 6 y 7 usan D3 v7: los directorios calcula/puyuspa-6.0/ y calcula/puyuspa-7.0/ contienen psicro.html y sistema.html, que cargan d3.v7.min.js. En sistema.html se construyen gráficos SVG con d3.select, d3.scaleLinear, d3.scaleLog, d3.line, d3.axisBottom y d3.axisLeft. Puyuspa aporta la interfaz de alto nivel para elegir sistemas y variables; D3 aporta las herramientas de dibujo.

No se incorpora D3 como dependencia de Simplot. Tampoco se presume que alguna herramienta externa entienda .ds, PARAPLOT o las unidades de Simusol. El manual desarrolla la comparación y distingue el dibujo web de Puyuspa del camino Simplot/Gnuplot.

En el recorrido de simulación, Siru llama a Simplot por defecto al terminar y le entrega descripción gráfica y tabla por pipe. La opción -nosimplot permite anular esa llamada; no es necesario solicitar el dibujo expresamente.

## Aplicación al diseño

Actualización de responsabilidades (2026-10-08): las capacidades numéricas identificadas aquí se incorporarán a Tabular2, según [su catálogo y plan](../../tabular2/doc/PLAN-PROCESAMIENTO-NUMERICO.md). En Simplot se implementarán su consumo y representación, no copias de esos algoritmos. Las decisiones siguientes se aplican respetando esa separación.

1. Un solo lector de descripciones: slex; un DAT versionado compartido por Siru y Simplot.
2. Conservar orden, nombres, unidades y procedencia. La simulación y el dibujo siguen separados.
3. Primero asegurar tablas, reruns, selección y errores con el corpus; después ampliar series con expresiones y barras de error.
4. Evolucionar del valor textual de cada orden a series/transformaciones tipadas, con versiones explícitas; no ejecutar Perl/JavaScript leído del DAT.
5. Agregar bloques de corrida y validar alineación antes de operar entre columnas. No interpolar silenciosamente entre corridas.

La revisión no equivale a haber implementado FFT, ajuste, barras de error, interfaz web ni expresiones entre bloques.
