# alexalkhatib/granulometry-java-app architecture

> Architecture diagram of the GitHub repository alexalkhatib/granulometry-java-app, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-11). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/alexalkhatib/granulometry-java-app
- Repository: https://github.com/alexalkhatib/granulometry-java-app

## Overview

Granulométrie Studio is a JavaFX desktop application for measuring particle sizes in scientific images. The main workflow imports an image and analysis settings, runs segmentation and particle measurements in a background task, then presents distributions and statistics for inspection and export. Operators can also save sessions to a local H2 history and reopen or delete them. The graph covers the documented product capabilities; several UI and persistence links rely on README statements or SOURCE INDEX references, since those implementations were not fully sampled.

Main entry points: [`src/main/java/fr/granulometrie/ui/ResultView.java`](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/ui/ResultView.java) (Results and charts), [`src/main/java/fr/granulometrie/ui/AnalyzeView.java`](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/ui/AnalyzeView.java) (Image and settings), [`src/main/java/fr/granulometrie/core/ImageAnalyzer.java`](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/core/ImageAnalyzer.java) (Image analyzer), [`src/main/java/fr/granulometrie/ui/HistoryView.java`](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/ui/HistoryView.java) (Session history)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_workflow["Analysis workflow"]
  node_analysis_view["Image and settings<br/>[AnalyzeView.java]"]
  node_parameters["Analysis parameters"]
  node_analyzer["Image analyzer<br/>[ImageAnalyzer.java]"]
  node_segmentation["Segmentation<br/>[Segmentation.java]"]
  node_particle["Particle measurements<br/>[Particle.java]"]
  node_result["Analysis result"]
end

subgraph group_results["Results and export"]
  node_statistics["Size statistics"]
  node_stats_utils["Statistics utilities"]
  node_classifier["Size classification"]
  node_result_view["Results and charts<br/>[ResultView.java]"]
  node_overlay["Detection overlay"]
  node_csv["CSV exporter<br/>[CsvExporter.java]"]
end

subgraph group_history["Local history"]
  node_history_view["Session history<br/>[HistoryView.java]"]
  node_repository["Analysis repository"]
  node_session["Stored session<br/>[StoredSession.java]"]
  node_h2[("Local H2 database")]
end

subgraph group_app["Application interface"]
  node_app["JavaFX application"]
  node_navigation["Window navigation<br/>[MainWindow.java]"]
  node_ui_factory["Shared UI components<br/>[UiFactory.java]"]
end

node_operator(("Operator"))

node_operator -->|"imports image"| node_analysis_view
node_operator -->|"sets options"| node_analysis_view
node_app -->|"creates window"| node_navigation
node_navigation -->|"shows view"| node_analysis_view
node_analysis_view -->|"updates settings"| node_parameters
node_analysis_view -->|"runs analysis"| node_analyzer
node_analyzer -->|"reads settings"| node_parameters
node_analyzer -->|"segments image"| node_segmentation
node_segmentation -->|"builds measurements"| node_particle
node_analyzer -->|"returns result"| node_result
node_result -->|"computes summary"| node_statistics
node_statistics -->|"uses calculations"| node_stats_utils
node_navigation -->|"shows results"| node_result_view
node_result_view -->|"builds size classes"| node_classifier
node_result_view -->|"displays measurements"| node_result
node_analysis_view -->|"renders overlay"| node_overlay
node_result_view -->|"exports CSV"| node_csv
node_result_view -->|"exports chart PNG"| node_operator
node_result_view -->|"saves session"| node_repository
node_navigation -->|"shows history"| node_history_view
node_history_view -->|"loads and deletes"| node_repository
node_repository -->|"reads and writes"| node_h2
node_repository -->|"creates sessions"| node_session
node_history_view -->|"opens saved result"| node_result_view
node_analysis_view -->|"uses controls"| node_ui_factory
node_result_view -->|"uses components"| node_ui_factory
node_history_view -->|"uses components"| node_ui_factory

click node_app "https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/GranulometryApp.java"
click node_navigation "https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/ui/MainWindow.java"
click node_analysis_view "https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/ui/AnalyzeView.java"
click node_parameters "https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/core/AnalysisParameters.java"
click node_analyzer "https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/core/ImageAnalyzer.java"
click node_segmentation "https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/core/Segmentation.java"
click node_particle "https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/core/Particle.java"
click node_result "https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/core/AnalysisResult.java"
click node_statistics "https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/core/SizeStatistics.java"
click node_stats_utils "https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/core/StatisticsUtils.java"
click node_classifier "https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/core/SizeClassifier.java"
click node_result_view "https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/ui/ResultView.java"
click node_overlay "https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/io/OverlayRenderer.java"
click node_csv "https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/io/CsvExporter.java"
click node_history_view "https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/ui/HistoryView.java"
click node_repository "https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/repo/AnalysisRepository.java"
click node_session "https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/repo/StoredSession.java"
click node_ui_factory "https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/ui/UiFactory.java"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_analysis_view,node_parameters,node_analyzer,node_segmentation,node_particle,node_result toneBlue
class node_statistics,node_stats_utils,node_classifier,node_result_view,node_overlay,node_csv toneAmber
class node_history_view,node_repository,node_session,node_h2 toneMint
class node_app,node_navigation,node_ui_factory toneRose
class node_operator toneIndigo
```

## Components

### Analysis workflow

- [Image and settings](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/ui/AnalyzeView.java): `src/main/java/fr/granulometrie/ui/AnalyzeView.java`
- [Analysis parameters](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/core/AnalysisParameters.java): `src/main/java/fr/granulometrie/core/AnalysisParameters.java`
- [Image analyzer](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/core/ImageAnalyzer.java): `src/main/java/fr/granulometrie/core/ImageAnalyzer.java`
- [Segmentation](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/core/Segmentation.java): `src/main/java/fr/granulometrie/core/Segmentation.java`
- [Particle measurements](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/core/Particle.java): `src/main/java/fr/granulometrie/core/Particle.java`
- [Analysis result](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/core/AnalysisResult.java): `src/main/java/fr/granulometrie/core/AnalysisResult.java`

### Results and export

- [Size statistics](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/core/SizeStatistics.java): `src/main/java/fr/granulometrie/core/SizeStatistics.java`
- [Statistics utilities](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/core/StatisticsUtils.java): `src/main/java/fr/granulometrie/core/StatisticsUtils.java`
- [Size classification](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/core/SizeClassifier.java): `src/main/java/fr/granulometrie/core/SizeClassifier.java`
- [Results and charts](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/ui/ResultView.java): `src/main/java/fr/granulometrie/ui/ResultView.java`
- [Detection overlay](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/io/OverlayRenderer.java): `src/main/java/fr/granulometrie/io/OverlayRenderer.java`
- [CSV exporter](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/io/CsvExporter.java): `src/main/java/fr/granulometrie/io/CsvExporter.java`

### Local history

- [Session history](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/ui/HistoryView.java): `src/main/java/fr/granulometrie/ui/HistoryView.java`
- [Analysis repository](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/repo/AnalysisRepository.java): `src/main/java/fr/granulometrie/repo/AnalysisRepository.java`
- [Stored session](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/repo/StoredSession.java): `src/main/java/fr/granulometrie/repo/StoredSession.java`
- **Local H2 database**

### Application interface

- [JavaFX application](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/GranulometryApp.java): `src/main/java/fr/granulometrie/GranulometryApp.java`
- [Window navigation](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/ui/MainWindow.java): `src/main/java/fr/granulometrie/ui/MainWindow.java`
- [Shared UI components](https://github.com/alexalkhatib/granulometry-java-app/blob/main/src/main/java/fr/granulometrie/ui/UiFactory.java): `src/main/java/fr/granulometrie/ui/UiFactory.java`

### Other components

- **Operator**

## Connections

- Operator → Image and settings: imports image (evidence: `README.md`)
- Operator → Image and settings: sets options (evidence: `README.md`)
- JavaFX application → Window navigation: creates window (evidence: `src/main/java/fr/granulometrie/GranulometryApp.java`)
- Window navigation → Image and settings: shows view (evidence: `src/main/java/fr/granulometrie/ui/MainWindow.java`)
- Image and settings → Analysis parameters: updates settings (evidence: `src/main/java/fr/granulometrie/ui/AnalyzeView.java`)
- Image and settings → Image analyzer: runs analysis (evidence: `src/main/java/fr/granulometrie/ui/AnalyzeView.java`)
- Image analyzer → Analysis parameters: reads settings (evidence: `src/main/java/fr/granulometrie/core/ImageAnalyzer.java`)
- Image analyzer → Segmentation: segments image (evidence: `src/main/java/fr/granulometrie/core/ImageAnalyzer.java`)
- Segmentation → Particle measurements: builds measurements (evidence: `src/main/java/fr/granulometrie/core/Segmentation.java`)
- Image analyzer → Analysis result: returns result (evidence: `src/main/java/fr/granulometrie/core/ImageAnalyzer.java`)
- Analysis result → Size statistics: computes summary (evidence: `src/main/java/fr/granulometrie/core/AnalysisResult.java`)
- Size statistics → Statistics utilities: uses calculations (evidence: `src/main/java/fr/granulometrie/core/SizeStatistics.java`)
- Window navigation → Results and charts: shows results (evidence: `src/main/java/fr/granulometrie/ui/MainWindow.java`)
- Results and charts → Size classification: builds size classes (evidence: `src/main/java/fr/granulometrie/ui/ResultView.java`)
- Results and charts → Analysis result: displays measurements (evidence: `src/main/java/fr/granulometrie/ui/ResultView.java`)
- Image and settings → Detection overlay: renders overlay (evidence: `src/main/java/fr/granulometrie/ui/AnalyzeView.java`)
- Results and charts → CSV exporter: exports CSV (evidence: `src/main/java/fr/granulometrie/ui/ResultView.java`)
- Results and charts → Operator: exports chart PNG (evidence: `README.md`)
- Results and charts → Analysis repository: saves session (evidence: `src/main/java/fr/granulometrie/ui/ResultView.java`)
- Window navigation → Session history: shows history (evidence: `src/main/java/fr/granulometrie/ui/MainWindow.java`)
- Session history → Analysis repository: loads and deletes (evidence: `src/main/java/fr/granulometrie/ui/HistoryView.java`)
- Analysis repository → Local H2 database: reads and writes (evidence: `src/main/java/fr/granulometrie/repo/AnalysisRepository.java`)
- Analysis repository → Stored session: creates sessions (evidence: `src/main/java/fr/granulometrie/repo/AnalysisRepository.java`)
- Session history → Results and charts: opens saved result (evidence: `src/main/java/fr/granulometrie/ui/MainWindow.java`)
- Image and settings → Shared UI components: uses controls (evidence: `src/main/java/fr/granulometrie/ui/AnalyzeView.java`)
- Results and charts → Shared UI components: uses components (evidence: `src/main/java/fr/granulometrie/ui/ResultView.java`)
- Session history → Shared UI components: uses components (evidence: `src/main/java/fr/granulometrie/ui/HistoryView.java`)
