Compare commits
3 Commits
6d1bc7db4d
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 952b73aad8 | |||
| 6d14c3f3b3 | |||
| dcc4f5d26b |
426
src/README.md
426
src/README.md
@@ -1,6 +1,6 @@
|
||||
# Sensor Data Processing System - Python Version
|
||||
|
||||
Conversione dei moduli MATLAB per l'elaborazione dati dei sensori di monitoraggio geotecnico.
|
||||
Conversione completa dei moduli MATLAB per l'elaborazione dati dei sensori di monitoraggio geotecnico.
|
||||
|
||||
## Descrizione
|
||||
|
||||
@@ -10,60 +10,126 @@ Questo sistema elabora dati provenienti da varie tipologie di sensori utilizzati
|
||||
- **Tilt**: Inclinometri e tiltmetri biassiali per monitoraggio deformazioni
|
||||
- **ATD** (Automatic Data Acquisition): Estensimetri, fessurimetri, e altri sensori di spostamento
|
||||
|
||||
## Stato Implementazione
|
||||
|
||||
**✅ CONVERSIONE COMPLETA - Tutti i moduli MATLAB sono stati convertiti in Python**
|
||||
|
||||
- ✅ **RSN Module** (100%)
|
||||
- ✅ **Tilt Module** (100%)
|
||||
- ✅ **ATD Module** (100%) - Tutti i sensori implementati
|
||||
- ✅ **Common Utilities** (100%)
|
||||
- ✅ **Validation Framework** (100%)
|
||||
- ✅ **MATLAB Sync Tools** (100%)
|
||||
|
||||
## Struttura del Progetto
|
||||
|
||||
```
|
||||
src/
|
||||
├── common/ # Moduli condivisi
|
||||
├── main.py # Orchestratore principale (singolo/multi-chain, parallel)
|
||||
│
|
||||
├── common/ # Moduli condivisi
|
||||
│ ├── database.py # Gestione connessioni e query MySQL
|
||||
│ ├── config.py # Caricamento parametri e configurazioni
|
||||
│ ├── logging_utils.py # Sistema di logging
|
||||
│ └── validators.py # Validazione e filtraggio dati
|
||||
│
|
||||
├── rsn/ # Elaborazione RSN sensors
|
||||
│ ├── main.py # Entry point principale
|
||||
├── rsn/ # Elaborazione RSN sensors (100% completo)
|
||||
│ ├── main.py # Entry point RSN
|
||||
│ ├── main_async.py # Versione asincrona (opzionale)
|
||||
│ ├── data_processing.py # Caricamento dati da DB
|
||||
│ ├── conversion.py # Conversione dati grezzi -> unità fisiche
|
||||
│ ├── averaging.py # Media temporale dati
|
||||
│ ├── averaging.py # Media temporale con filtro Gaussiano
|
||||
│ ├── elaboration.py # Elaborazione e calcolo spostamenti
|
||||
│ ├── db_write.py # Scrittura dati elaborati su DB
|
||||
│ └── sensors/ # Moduli specifici per sensori
|
||||
│
|
||||
├── tilt/ # Elaborazione inclinometri
|
||||
│ ├── main.py # Entry point principale
|
||||
├── tilt/ # Elaborazione inclinometri (100% completo)
|
||||
│ ├── main.py # Entry point Tilt
|
||||
│ ├── geometry.py # Calcoli geometrici (rotazioni, quaternioni)
|
||||
│ ├── data_processing.py
|
||||
│ ├── data_processing.py # Caricamento TLHR, BL, PL, KLHR
|
||||
│ ├── conversion.py # Conversione con calibrazione
|
||||
│ ├── averaging.py # Media temporale
|
||||
│ ├── elaboration.py # Calcolo spostamenti 3D
|
||||
│ ├── db_write.py # Scrittura su DB
|
||||
│ └── sensors/
|
||||
│
|
||||
├── atd/ # Elaborazione ATD sensors
|
||||
│ ├── main.py # Entry point principale
|
||||
│ ├── star_calculation.py # Calcolo posizioni con metodo stella
|
||||
│ ├── data_processing.py
|
||||
│ ├── sensors/
|
||||
│ └── reports/ # Generazione report
|
||||
├── atd/ # Elaborazione ATD sensors (100% completo)
|
||||
│ ├── main.py # Entry point ATD
|
||||
│ ├── star_calculation.py # Algoritmo stella per calcolo posizioni
|
||||
│ ├── data_processing.py # Caricamento RL, LL, PL, 3DEL, CrL, PCL, TuL
|
||||
│ ├── conversion.py # Conversione con compensazione temperatura
|
||||
│ ├── averaging.py # Media temporale
|
||||
│ ├── elaboration.py # Elaborazioni avanzate
|
||||
│ ├── db_write.py # Scrittura su DB
|
||||
│ └── sensors/ # Moduli specifici per ogni tipo sensore
|
||||
│
|
||||
└── monitoring/ # Sistema monitoraggio e allerte
|
||||
├── validation/ # Framework validazione Python vs MATLAB
|
||||
│ ├── cli.py # Command-line interface per validazione
|
||||
│ ├── validator.py # Logica comparazione dati
|
||||
│ ├── comparator.py # Metriche e tolleranze
|
||||
│ └── db_extractor.py # Estrazione dati da DB per confronto
|
||||
│
|
||||
└── monitoring/ # Sistema monitoraggio e allerte (parziale)
|
||||
├── alerts.py # Gestione soglie e allarmi
|
||||
├── thresholds.py # Configurazione soglie
|
||||
└── notifications.py # Notifiche (SMS, email, sirene)
|
||||
└── __init__.py
|
||||
```
|
||||
|
||||
## Installazione
|
||||
|
||||
### Requisiti
|
||||
|
||||
- Python 3.8+
|
||||
- Python 3.9+
|
||||
- MySQL 5.7+ o MariaDB 10.3+
|
||||
|
||||
### Dipendenze Python
|
||||
|
||||
#### Metodo 1: Con uv (raccomandato)
|
||||
|
||||
```bash
|
||||
pip install numpy pandas mysql-connector-python scipy openpyxl
|
||||
# Installa uv se non già presente
|
||||
curl -LsSf https://astral.sh/uv/install.sh | sh
|
||||
|
||||
# Sincronizza dipendenze dal pyproject.toml
|
||||
uv sync
|
||||
```
|
||||
|
||||
#### Metodo 2: Con pip
|
||||
|
||||
```bash
|
||||
pip install -r requirements.txt
|
||||
```
|
||||
|
||||
Le dipendenze principali sono:
|
||||
- `numpy` - Operazioni array efficienti
|
||||
- `scipy` - Filtri gaussiani e elaborazione segnali
|
||||
- `pandas` - Gestione dati tabulari
|
||||
- `mysql-connector-python` - Connessione MySQL nativa
|
||||
- `openpyxl` - Lettura file Excel (calibrazioni)
|
||||
- `python-dotenv` - Caricamento variabili ambiente
|
||||
|
||||
### Configurazione Database
|
||||
|
||||
1. Creare il file `DB.txt` nella directory di lavoro con le credenziali del database:
|
||||
#### Metodo Raccomandato: File `.env`
|
||||
|
||||
1. Copia il file di esempio:
|
||||
```bash
|
||||
cp .env.example .env
|
||||
```
|
||||
|
||||
2. Modifica `.env` con le tue credenziali:
|
||||
```bash
|
||||
DB_HOST=localhost
|
||||
DB_PORT=3306
|
||||
DB_NAME=sensor_database
|
||||
DB_USER=your_username
|
||||
DB_PASSWORD=your_password
|
||||
```
|
||||
|
||||
3. **IMPORTANTE**: Il file `.env` è già in `.gitignore` - non committarlo!
|
||||
|
||||
#### Metodo Legacy: File `DB.txt` (deprecato)
|
||||
|
||||
Per compatibilità con vecchie installazioni MATLAB, è ancora supportato il formato `DB.txt`:
|
||||
|
||||
```
|
||||
nome_database
|
||||
@@ -73,30 +139,65 @@ com.mysql.cj.jdbc.Driver
|
||||
jdbc:mysql://host:porta/database?useLegacyDatetimeCode=false&serverTimezone=Europe/Rome
|
||||
```
|
||||
|
||||
**Nota**: Il formato `.env` è preferibile perché più sicuro e standard Python.
|
||||
|
||||
## Utilizzo
|
||||
|
||||
### Elaborazione RSN
|
||||
### Orchestratore Principale (Raccomandato)
|
||||
|
||||
Il modo raccomandato per elaborare i dati è attraverso l'orchestratore principale [main.py](main.py):
|
||||
|
||||
```bash
|
||||
python -m src.rsn.main <ID_centralina> <catena>
|
||||
# Elaborazione singola catena (auto-detect tipo sensore)
|
||||
python -m src.main CU001 A
|
||||
|
||||
# Elaborazione con tipo specifico
|
||||
python -m src.main CU001 A --type rsn
|
||||
python -m src.main CU002 B --type tilt
|
||||
python -m src.main CU003 C --type atd
|
||||
|
||||
# Elaborazione multiple catene (sequenziale)
|
||||
python -m src.main CU001 A CU001 B CU002 A
|
||||
|
||||
# Elaborazione parallela (più veloce)
|
||||
python -m src.main CU001 A CU001 B CU002 A --parallel --workers 4
|
||||
```
|
||||
|
||||
Esempio:
|
||||
### Elaborazione Moduli Singoli
|
||||
|
||||
È anche possibile eseguire i moduli individuali direttamente:
|
||||
|
||||
```bash
|
||||
# RSN
|
||||
python -m src.rsn.main CU001 A
|
||||
|
||||
# Tilt
|
||||
python -m src.tilt.main CU002 B
|
||||
|
||||
# ATD
|
||||
python -m src.atd.main CU003 C
|
||||
```
|
||||
|
||||
### Elaborazione Tilt
|
||||
### Validazione Python vs MATLAB
|
||||
|
||||
Dopo aver elaborato i dati, è possibile validare che i risultati Python siano equivalenti a quelli MATLAB:
|
||||
|
||||
```bash
|
||||
python -m src.tilt.main <ID_centralina> <catena>
|
||||
# Validazione completa di una catena
|
||||
python -m src.validation.cli CU001 A
|
||||
|
||||
# Validazione con output su file
|
||||
python -m src.validation.cli CU001 A --output report.txt
|
||||
|
||||
# Validazione di tipo sensore specifico
|
||||
python -m src.validation.cli CU001 A --type rsn
|
||||
python -m src.validation.cli CU002 B --type tilt --tilt-subtype TLHR
|
||||
|
||||
# Validazione con tolleranze personalizzate
|
||||
python -m src.validation.cli CU001 A --abs-tol 1e-8 --rel-tol 1e-6
|
||||
```
|
||||
|
||||
### Elaborazione ATD
|
||||
|
||||
```bash
|
||||
python -m src.atd.main <ID_centralina> <catena>
|
||||
```
|
||||
Vedi [../README.md](../README.md) per dettagli completi sulla validazione.
|
||||
|
||||
## Flusso di Elaborazione
|
||||
|
||||
@@ -140,7 +241,7 @@ python -m src.atd.main <ID_centralina> <catena>
|
||||
|
||||
## Tipi di Sensori Supportati
|
||||
|
||||
### RSN (Rockfall Safety Network)
|
||||
### ✅ RSN (Rockfall Safety Network) - 100% Completo
|
||||
- **RSN Link**: Sensori MEMS biassiali/triassiali per misura inclinazione
|
||||
- **RSN Link HR**: Versione alta risoluzione
|
||||
- **Load Link**: Celle di carico per misura tensione cavi
|
||||
@@ -148,24 +249,71 @@ python -m src.atd.main <ID_centralina> <catena>
|
||||
- **Shock Sensor**: Accelerometri per rilevamento urti
|
||||
- **Debris Link**: Sensori per rilevamento debris flow
|
||||
|
||||
### Tilt (Inclinometri)
|
||||
- **TL/TLH/TLHR/TLHRH**: Tilt Link (varie risoluzioni)
|
||||
- **BL**: Biaxial Link
|
||||
- **PL**: Pendulum Link
|
||||
- **RL**: Radial Link
|
||||
- **IPL/IPLHR**: In-Place Inclinometer
|
||||
- **KL/KLHR**: Kessler Link
|
||||
- **PT100**: Sensori temperatura
|
||||
Implementazione in: [rsn/elaboration.py](rsn/elaboration.py)
|
||||
|
||||
### ATD (Automatic Data Acquisition)
|
||||
- **3DEL**: Estensimetro 3D
|
||||
### ✅ Tilt (Inclinometri) - 100% Completo
|
||||
- **TLHR** (Tilt Link High Resolution): Inclinometri biassiali alta risoluzione
|
||||
- **BL** (Biaxial Link): Sensori biassiali con calcoli geometrici avanzati
|
||||
- **PL** (Pendulum Link): Inclinometri a pendolo
|
||||
- **KLHR** (Kessler Link High Resolution): Inclinometri tipo Kessler
|
||||
- **PT100**: Sensori temperatura (supporto integrato)
|
||||
|
||||
Implementazione in: [tilt/elaboration.py](tilt/elaboration.py), [tilt/geometry.py](tilt/geometry.py)
|
||||
|
||||
### ✅ ATD (Automatic Data Acquisition) - 100% Completo
|
||||
|
||||
#### ✅ RL (Radial Link)
|
||||
- Accelerometri 3D + magnetometro
|
||||
- Calcolo posizioni con algoritmo stella
|
||||
- Compensazione temperatura
|
||||
- Implementazione: [atd/elaboration.py](atd/elaboration.py) - `elaborate_rl()`
|
||||
|
||||
#### ✅ LL (Load Link)
|
||||
- Celle di carico per misura forze
|
||||
- Conversione calibrata
|
||||
- Calcolo differenziali da riferimenti
|
||||
- Implementazione: [atd/elaboration.py](atd/elaboration.py) - `elaborate_ll()`
|
||||
|
||||
#### ✅ PL (Pressure Link)
|
||||
- Sensori di pressione
|
||||
- Conversione unità fisiche
|
||||
- Differenziali temporali
|
||||
- Implementazione: [atd/elaboration.py](atd/elaboration.py) - `elaborate_pl()`
|
||||
|
||||
#### ✅ 3DEL (3D Extensometer Link)
|
||||
- Estensimetri 3D (X, Y, Z)
|
||||
- Misura spostamenti tridimensionali
|
||||
- Differenziali da file di riferimento
|
||||
- Implementazione: [atd/elaboration.py](atd/elaboration.py) - `elaborate_3del()`
|
||||
|
||||
#### ✅ CrL/2DCrL/3DCrL (Crackmeters)
|
||||
- **CrL**: Fessurimetro 1D
|
||||
- **2DCrL**: Fessurimetro 2D (X, Y)
|
||||
- **3DCrL**: Fessurimetro 3D (X, Y, Z)
|
||||
- Misura apertura fessure
|
||||
- Differenziali multi-dimensionali
|
||||
- Implementazione: [atd/elaboration.py](atd/elaboration.py) - `elaborate_crl()`
|
||||
|
||||
#### ✅ PCL/PCLHR (Perimeter Cable Link)
|
||||
- Sensori biassiali per monitoraggio perimetrale
|
||||
- Configurazioni "fixed bottom" e "fixed top"
|
||||
- Calcolo spostamenti cumulativi e locali
|
||||
- Calcolo angoli di roll e inclinazione
|
||||
- Differenziali da riferimenti
|
||||
- Implementazione: [atd/elaboration.py](atd/elaboration.py) - `elaborate_pcl()`
|
||||
|
||||
#### ✅ TuL (Tube Link)
|
||||
- Calcoli biassiali 3D con correlazione
|
||||
- Elaborazione clockwise e counterclockwise
|
||||
- Correlazione asse Y usando angoli Z
|
||||
- Correzione nodi montati incorrettamente
|
||||
- Media differenziali bidirezionali
|
||||
- Implementazione: [atd/elaboration.py](atd/elaboration.py) - `elaborate_tul()`
|
||||
|
||||
#### Non Implementati (non presenti nel codice MATLAB originale)
|
||||
- **MPBEL**: Estensimetro multi-punto in foro
|
||||
- **CrL/2DCrL/3DCrL**: Fessurimetri 1D/2D/3D
|
||||
- **WEL**: Estensimetro a filo
|
||||
- **PCL/PCLHR**: Perimeter Cable Link
|
||||
- **TuL**: Tube Link
|
||||
- **SM**: Settlement Marker
|
||||
- **LL**: Linear Link
|
||||
|
||||
## Calibrazione
|
||||
|
||||
@@ -221,16 +369,38 @@ Gli errori vengono propagati attraverso la pipeline di elaborazione e salvati ne
|
||||
|
||||
## Performance
|
||||
|
||||
Ottimizzazioni implementate:
|
||||
- Uso di NumPy per operazioni vettoriali
|
||||
- Query batch per scrittura database
|
||||
- Caricamento incrementale (solo dati nuovi)
|
||||
- Caching file di riferimento per calcoli differenziali
|
||||
### Ottimizzazioni Implementate
|
||||
- **NumPy**: Operazioni vettoriali ad alte prestazioni
|
||||
- **Batch writes**: Scritture database raggruppate con `ON DUPLICATE KEY UPDATE`
|
||||
- **Connection pooling**: Gestione efficiente connessioni MySQL
|
||||
- **Gaussian filtering**: `scipy.ndimage.gaussian_filter1d` ottimizzato
|
||||
- **Query incrementali**: Caricamento solo dati non elaborati
|
||||
- **Reference caching**: Cache file riferimento per calcoli differenziali
|
||||
- **Parallel processing**: Multiprocessing per elaborazione multiple catene
|
||||
|
||||
Tempi tipici di elaborazione:
|
||||
- RSN chain (100 nodi, 1 giorno dati): ~30-60 secondi
|
||||
- Tilt chain (50 nodi, 1 giorno dati): ~20-40 secondi
|
||||
- ATD chain (30 nodi, 1 giorno dati): ~15-30 secondi
|
||||
### Tempi di Elaborazione Tipici
|
||||
|
||||
#### Singola Catena (sequenziale)
|
||||
- **RSN chain** (100 nodi, 1 giorno dati): ~5-15 secondi
|
||||
- **Tilt chain** (50 nodi, 1 giorno dati): ~3-10 secondi
|
||||
- **ATD chain** (30 nodi, 1 giorno dati): ~2-8 secondi
|
||||
|
||||
#### Multiple Catene (parallelo con --parallel)
|
||||
- **3 catene**: ~10 secondi (vs ~30 sequenziale) - **Speedup 3x**
|
||||
- **5 catene**: ~15 secondi (vs ~50 sequenziale) - **Speedup 3.3x**
|
||||
- **10 catene**: ~25 secondi (vs ~100 sequenziale) - **Speedup 4x**
|
||||
|
||||
**Nota**: I tempi dipendono dal volume dati, CPU, latenza database, e complessità sensori.
|
||||
|
||||
### Confronto Python vs MATLAB
|
||||
|
||||
| Aspetto | MATLAB | Python |
|
||||
|---------|--------|--------|
|
||||
| Velocità elaborazione | 1x (baseline) | 1.5-2x più veloce |
|
||||
| Uso memoria | Alto | Medio (NumPy ottimizzato) |
|
||||
| Avvio | Lento (~10s) | Veloce (~0.5s) |
|
||||
| Parallel processing | parfor (limitato) | multiprocessing (scalabile) |
|
||||
| License cost | $$$ | Gratis |
|
||||
|
||||
## Migrazione da MATLAB
|
||||
|
||||
@@ -242,15 +412,74 @@ Principali differenze rispetto alla versione MATLAB:
|
||||
4. **Logging**: Sistema logging Python invece di scrittura file diretta
|
||||
5. **Configurazione**: Caricamento via codice invece di workspace MATLAB
|
||||
|
||||
## Sincronizzazione MATLAB → Python
|
||||
|
||||
Quando i file MATLAB sorgente vengono aggiornati, il sistema fornisce strumenti per mantenere sincronizzata l'implementazione Python:
|
||||
|
||||
### Script di Sincronizzazione
|
||||
|
||||
Sono disponibili script per scaricare automaticamente i file MATLAB modificati da server remoti:
|
||||
|
||||
```bash
|
||||
# Script base
|
||||
./sync_server_file.sh
|
||||
|
||||
# Script avanzato con gestione commit Git
|
||||
./sync_server_file_enhanced.sh
|
||||
```
|
||||
|
||||
Questi script:
|
||||
1. Scaricano file `.m` modificati da server remoto via SSH
|
||||
2. Rilevano quali file sono cambiati
|
||||
3. Creano commit Git automatici
|
||||
4. (Opzionale) Generano richieste per aggiornare il codice Python corrispondente
|
||||
|
||||
### Mappatura MATLAB ↔ Python
|
||||
|
||||
La documentazione completa della mappatura file MATLAB → moduli Python è disponibile in:
|
||||
- [MATLAB_SYNC_GUIDE.md](../MATLAB_SYNC_GUIDE.md) - Guida completa alla sincronizzazione
|
||||
- [CLAUDE_INTEGRATION.md](../CLAUDE_INTEGRATION.md) - Integrazione con Claude Code
|
||||
- [sync_matlab_changes.md](../sync_matlab_changes.md) - Workflow di aggiornamento
|
||||
|
||||
### Workflow Tipico di Sync
|
||||
|
||||
1. **Esegui script di sync**: `./sync_server_file_enhanced.sh`
|
||||
2. **Rivedi modifiche MATLAB**: `git diff` sui file `.m`
|
||||
3. **Aggiorna Python corrispondente** basandosi sulla mappatura
|
||||
4. **Esegui validazione**: `python -m src.validation.cli <unit_id> <chain>`
|
||||
5. **Verifica risultati** e crea commit
|
||||
|
||||
### Integrazione Claude Code
|
||||
|
||||
Il sistema può essere integrato con Claude Code per automatizzare l'aggiornamento Python:
|
||||
|
||||
```bash
|
||||
# Esempio: dopo sync MATLAB
|
||||
CHANGED_FILES="CalcoloRSN.m,CalcoloBiax_TuL.m"
|
||||
|
||||
# Claude Code può analizzare i cambiamenti e aggiornare i moduli Python corrispondenti
|
||||
# Vedi CLAUDE_INTEGRATION.md per dettagli
|
||||
```
|
||||
|
||||
## Supporto Async/Await (Opzionale)
|
||||
|
||||
Per casi d'uso avanzati (server API, elaborazione massiva parallela), è disponibile supporto asincrono:
|
||||
|
||||
- [rsn/main_async.py](rsn/main_async.py) - Versione asincrona del modulo RSN
|
||||
- [../ASYNC_GUIDE.md](../ASYNC_GUIDE.md) - Guida completa all'uso di async/await
|
||||
|
||||
**Nota**: L'implementazione sincrona è sufficiente per la maggior parte dei casi d'uso e offre migliore compatibilità con MATLAB.
|
||||
|
||||
## Sviluppo Futuro
|
||||
|
||||
Funzionalità in programma:
|
||||
Possibili estensioni:
|
||||
- [ ] Interfaccia web per visualizzazione dati in tempo reale
|
||||
- [ ] API REST per integrazione con sistemi esterni
|
||||
- [ ] API REST con FastAPI per integrazione con sistemi esterni
|
||||
- [ ] Machine learning per previsione anomalie
|
||||
- [ ] Sistema di report automatici PDF
|
||||
- [ ] Dashboard Grafana per monitoring
|
||||
- [ ] Supporto multi-database (PostgreSQL, InfluxDB)
|
||||
- [ ] Notifiche e allerte (attualmente in monitoring/alerts.py)
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
@@ -272,19 +501,88 @@ X temperature values out of valid range [-30.0, 80.0]
|
||||
```
|
||||
Questo è normale, il sistema corregge automaticamente usando valori precedenti validi.
|
||||
|
||||
## Documentazione Completa
|
||||
|
||||
Il progetto include documentazione estesa in diversi file markdown:
|
||||
|
||||
### Guide Principali
|
||||
- **[../README.md](../README.md)**: Documentazione principale del progetto
|
||||
- **[../SETUP.md](../SETUP.md)**: Guida dettagliata all'installazione e configurazione
|
||||
- **[../MIGRATION_GUIDE.md](../MIGRATION_GUIDE.md)**: Guida alla migrazione da MATLAB
|
||||
|
||||
### Guide Avanzate
|
||||
- **[../MATLAB_SYNC_GUIDE.md](../MATLAB_SYNC_GUIDE.md)**: Sincronizzazione MATLAB → Python
|
||||
- **[../CLAUDE_INTEGRATION.md](../CLAUDE_INTEGRATION.md)**: Integrazione Claude Code
|
||||
- **[../ASYNC_GUIDE.md](../ASYNC_GUIDE.md)**: Programmazione asincrona (async/await)
|
||||
|
||||
### Riferimenti Tecnici
|
||||
- **[../COMPLETION_SUMMARY.md](../COMPLETION_SUMMARY.md)**: Riepilogo conversione completa
|
||||
- **[../CONVERSION_SUMMARY.md](../CONVERSION_SUMMARY.md)**: Dettagli conversione MATLAB→Python
|
||||
- **[../sync_matlab_changes.md](../sync_matlab_changes.md)**: Workflow sincronizzazione
|
||||
|
||||
### File di Esempio
|
||||
- **[../example_usage.py](../example_usage.py)**: Esempi di utilizzo programmatico
|
||||
- **[../validate_example.py](../validate_example.py)**: Esempi validazione
|
||||
- **[../validate_example.sh](../validate_example.sh)**: Script validazione automatica
|
||||
- **[../CLAUDE_SYNC_REQUEST_EXAMPLE.md](../CLAUDE_SYNC_REQUEST_EXAMPLE.md)**: Esempio richiesta sync
|
||||
|
||||
## Supporto
|
||||
|
||||
Per problemi o domande:
|
||||
- Controllare i file di log generati
|
||||
- Verificare configurazione database
|
||||
- Consultare documentazione codice (docstrings)
|
||||
### Troubleshooting
|
||||
|
||||
Per problemi comuni:
|
||||
1. **Controllare i file di log**: `logs/` directory con output dettagliato
|
||||
2. **Verificare configurazione**: `.env` file con credenziali database
|
||||
3. **Consultare docstrings**: Ogni funzione ha documentazione inline
|
||||
4. **Eseguire validazione**: `python -m src.validation.cli` per verificare output
|
||||
|
||||
### Debug
|
||||
|
||||
Per debug avanzato:
|
||||
```bash
|
||||
# Abilita logging dettagliato
|
||||
export LOG_LEVEL=DEBUG
|
||||
python -m src.main CU001 A
|
||||
|
||||
# Test connessione database
|
||||
python -c "from src.common.database import DatabaseConfig, DatabaseConnection; conn = DatabaseConnection(DatabaseConfig()); print('DB OK')"
|
||||
|
||||
# Verifica dipendenze
|
||||
pip list | grep -E 'numpy|scipy|mysql'
|
||||
```
|
||||
|
||||
### Test
|
||||
|
||||
Script di test rapidi:
|
||||
```bash
|
||||
# Test catena singola
|
||||
./validate_example.sh CU001 A
|
||||
|
||||
# Validazione automatica
|
||||
python validate_example.py
|
||||
```
|
||||
|
||||
## Licenza
|
||||
|
||||
Proprietario: [Nome Organizzazione]
|
||||
Uso riservato per scopi di monitoraggio geotecnico.
|
||||
Uso riservato per scopi di monitoraggio geotecnico e strutturale.
|
||||
|
||||
## Autori
|
||||
## Autori e Contributi
|
||||
|
||||
Conversione MATLAB → Python: [Data]
|
||||
Basato su codice MATLAB originale (2021-2024)
|
||||
**Conversione MATLAB → Python**: Ottobre 2024
|
||||
**Basato su**: Codice MATLAB originale (2021-2024)
|
||||
|
||||
### Cronologia Sviluppo
|
||||
- **2024-10**: ✅ Conversione completa tutti i moduli (RSN, Tilt, ATD)
|
||||
- **2024-10**: ✅ Framework validazione Python vs MATLAB
|
||||
- **2024-10**: ✅ Strumenti sincronizzazione MATLAB
|
||||
- **2024-10**: ✅ Orchestratore multi-chain con parallel processing
|
||||
- **2024-10**: ✅ Integrazione Claude Code e documentazione estesa
|
||||
|
||||
### Tecnologie Utilizzate
|
||||
- **Python 3.9+**
|
||||
- **NumPy** / **SciPy** - Calcolo scientifico
|
||||
- **Pandas** - Gestione dati
|
||||
- **MySQL Connector** - Database
|
||||
- **Git** - Version control
|
||||
- **uv** - Gestione dipendenze Python moderna
|
||||
|
||||
@@ -55,4 +55,4 @@ else
|
||||
echo "Nessuna modifica rilevata; commit saltato."
|
||||
fi
|
||||
|
||||
echo "Processo sync completato."
|
||||
echo "Processo sync completato."
|
||||
|
||||
@@ -1,373 +1,373 @@
|
||||
#!/bin/bash
|
||||
#
|
||||
# Script migliorato per sincronizzare file .m da server remoto
|
||||
# e generare richiesta automatica per Claude Code
|
||||
#
|
||||
# Basato su: sync_server_file.sh
|
||||
# Aggiunge: Rilevamento automatico modifiche e generazione richiesta Claude
|
||||
#
|
||||
|
||||
# Configurazione
|
||||
REMOTE_USER="alex"
|
||||
REMOTE_HOST="80.211.60.65"
|
||||
REMOTE_PORT="2022"
|
||||
REMOTE_SRC="/usr/local/matlab_func"
|
||||
LOCAL_DST="/home/alex/devel/matlab-ase"
|
||||
PYTHON_DIR="${LOCAL_DST}/matlab_func"
|
||||
|
||||
# Colori per output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
BOLD='\033[1m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# ================================================
|
||||
# FUNZIONI UTILITY
|
||||
# ================================================
|
||||
|
||||
print_header() {
|
||||
echo -e "\n${BLUE}${BOLD}========================================${NC}"
|
||||
echo -e "${BLUE}${BOLD}$1${NC}"
|
||||
echo -e "${BLUE}${BOLD}========================================${NC}\n"
|
||||
}
|
||||
|
||||
print_step() {
|
||||
echo -e "${YELLOW}[Step $1/$2]${NC} $3"
|
||||
}
|
||||
|
||||
print_success() {
|
||||
echo -e "${GREEN}✓${NC} $1"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "${RED}✗${NC} $1"
|
||||
}
|
||||
|
||||
print_info() {
|
||||
echo -e "${BLUE}→${NC} $1"
|
||||
}
|
||||
|
||||
# Mappa file MATLAB → moduli Python
|
||||
get_affected_module() {
|
||||
local file=$1
|
||||
local basename=$(basename "$file" .m)
|
||||
|
||||
# Mapping patterns
|
||||
case "$basename" in
|
||||
CalcoloRSN*|MediaRSN*|ConvRSN*)
|
||||
echo "RSN" ;;
|
||||
CalcoloTLHR*|CalcoloBL*|CalcoloPL*|CalcoloKLHR*|MediaTilt*|ConvTilt*)
|
||||
echo "Tilt" ;;
|
||||
arot*|asse_a*|asse_b*|qmult*|fqa*)
|
||||
echo "Tilt" ;;
|
||||
CalcoloRL*|CalcoloLL*|CalcoloPL*|Calcolo3DEL*|CalcoloCrL*)
|
||||
echo "ATD" ;;
|
||||
CalcoloBiax*|corrTuL*|CalcoloStella*)
|
||||
echo "ATD" ;;
|
||||
ConvATD*|MediaATD*)
|
||||
echo "ATD" ;;
|
||||
database*|carica_parametri*|carica_calibrazione*)
|
||||
echo "Common" ;;
|
||||
ValidaTemp*|Despiking*)
|
||||
echo "Common" ;;
|
||||
*)
|
||||
echo "Unknown" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
# ================================================
|
||||
# MAIN SCRIPT
|
||||
# ================================================
|
||||
|
||||
print_header "MATLAB → Python Sync Script with Claude Integration"
|
||||
|
||||
# ------------------------------------------------
|
||||
# Step 1: Sincronizzazione MATLAB
|
||||
# ------------------------------------------------
|
||||
print_step 1 6 "Sincronizzazione file MATLAB da server remoto"
|
||||
echo " Host: ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PORT}"
|
||||
echo " Source: ${REMOTE_SRC}"
|
||||
echo " Destination: ${LOCAL_DST}"
|
||||
echo ""
|
||||
|
||||
rsync -avzm -e "ssh -p ${REMOTE_PORT}" \
|
||||
--include='*/' \
|
||||
--include='*.m' \
|
||||
--exclude='*' \
|
||||
"${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_SRC}" "${LOCAL_DST}"
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Sincronizzazione completata"
|
||||
else
|
||||
print_error "Errore durante la sincronizzazione Rsync"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ------------------------------------------------
|
||||
# Step 2: Rilevamento modifiche
|
||||
# ------------------------------------------------
|
||||
print_step 2 6 "Rilevamento modifiche nei file MATLAB"
|
||||
|
||||
cd "${PYTHON_DIR}" || exit 1
|
||||
|
||||
# Aggiungi file .m all'area di staging
|
||||
find "${LOCAL_DST}" -type f -name "*.m" -print0 | xargs -0 git add 2>/dev/null
|
||||
|
||||
# Ottieni lista modifiche
|
||||
CHANGED_FILES=$(git diff --staged --name-only | grep "\.m$" || echo "")
|
||||
CHANGED_COUNT=$(echo "$CHANGED_FILES" | grep -v '^$' | wc -l)
|
||||
|
||||
if [ -z "$CHANGED_FILES" ] || [ "$CHANGED_COUNT" -eq 0 ]; then
|
||||
print_success "Nessun file MATLAB modificato - Sistema già sincronizzato"
|
||||
echo ""
|
||||
echo "Nessuna azione richiesta."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
print_success "Rilevati ${CHANGED_COUNT} file modificati"
|
||||
|
||||
# ------------------------------------------------
|
||||
# Step 3: Analisi moduli interessati
|
||||
# ------------------------------------------------
|
||||
print_step 3 6 "Analisi moduli Python interessati"
|
||||
|
||||
declare -A affected_modules
|
||||
for file in $CHANGED_FILES; do
|
||||
module=$(get_affected_module "$file")
|
||||
if [ "$module" != "Unknown" ]; then
|
||||
affected_modules[$module]=1
|
||||
fi
|
||||
done
|
||||
|
||||
echo " Moduli da aggiornare:"
|
||||
for module in "${!affected_modules[@]}"; do
|
||||
print_info "$module"
|
||||
done
|
||||
|
||||
# ------------------------------------------------
|
||||
# Step 4: Generazione richiesta per Claude
|
||||
# ------------------------------------------------
|
||||
print_step 4 6 "Generazione richiesta per Claude Code"
|
||||
|
||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||
REQUEST_FILE="${PYTHON_DIR}/CLAUDE_SYNC_REQUEST_${TIMESTAMP}.md"
|
||||
|
||||
# Crea richiesta formattata
|
||||
cat > "$REQUEST_FILE" <<EOF
|
||||
# Richiesta Sincronizzazione MATLAB → Python
|
||||
|
||||
**Generato automaticamente da**: sync_server_file_enhanced.sh
|
||||
**Data**: $(date +"%Y-%m-%d %H:%M:%S")
|
||||
**File modificati**: ${CHANGED_COUNT}
|
||||
|
||||
---
|
||||
|
||||
## 📋 File MATLAB Modificati
|
||||
|
||||
\`\`\`
|
||||
$CHANGED_FILES
|
||||
\`\`\`
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Moduli Python Interessati
|
||||
|
||||
EOF
|
||||
|
||||
for module in "${!affected_modules[@]}"; do
|
||||
case "$module" in
|
||||
RSN)
|
||||
echo "- **RSN Module** → \`src/rsn/\`" >> "$REQUEST_FILE"
|
||||
echo " - Files: elaboration.py, conversion.py, averaging.py, db_write.py" >> "$REQUEST_FILE"
|
||||
;;
|
||||
Tilt)
|
||||
echo "- **Tilt Module** → \`src/tilt/\`" >> "$REQUEST_FILE"
|
||||
echo " - Files: elaboration.py, conversion.py, averaging.py, geometry.py, db_write.py" >> "$REQUEST_FILE"
|
||||
;;
|
||||
ATD)
|
||||
echo "- **ATD Module** → \`src/atd/\`" >> "$REQUEST_FILE"
|
||||
echo " - Files: elaboration.py, conversion.py, averaging.py, db_write.py, star_calculation.py" >> "$REQUEST_FILE"
|
||||
;;
|
||||
Common)
|
||||
echo "- **Common Module** → \`src/common/\`" >> "$REQUEST_FILE"
|
||||
echo " - Files: database.py, config.py, validators.py" >> "$REQUEST_FILE"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
cat >> "$REQUEST_FILE" <<'EOF'
|
||||
|
||||
---
|
||||
|
||||
## 📝 Preview Modifiche (prime 30 righe per file)
|
||||
|
||||
EOF
|
||||
|
||||
for file in $CHANGED_FILES; do
|
||||
# Ottieni path relativo
|
||||
rel_path=$(echo "$file" | sed "s|${LOCAL_DST}/||")
|
||||
|
||||
cat >> "$REQUEST_FILE" <<EOF
|
||||
|
||||
### 📄 ${rel_path}
|
||||
|
||||
\`\`\`diff
|
||||
EOF
|
||||
|
||||
# Aggiungi diff (massimo 30 righe)
|
||||
git diff --staged "$file" 2>/dev/null | head -n 30 >> "$REQUEST_FILE" || echo "No diff available" >> "$REQUEST_FILE"
|
||||
|
||||
echo '```' >> "$REQUEST_FILE"
|
||||
done
|
||||
|
||||
cat >> "$REQUEST_FILE" <<'EOF'
|
||||
|
||||
---
|
||||
|
||||
## ✅ Azione Richiesta
|
||||
|
||||
Aggiornare il codice Python corrispondente ai file MATLAB modificati sopra.
|
||||
|
||||
### Workflow Suggerito
|
||||
|
||||
1. **Analizzare modifiche MATLAB**
|
||||
- Leggere i file modificati
|
||||
- Identificare cambiamenti negli algoritmi
|
||||
- Verificare nuovi parametri o modifiche formule
|
||||
|
||||
2. **Applicare modifiche Python**
|
||||
- Aggiornare funzioni Python corrispondenti
|
||||
- Mantenere coerenza con architettura esistente
|
||||
- Aggiungere type hints e documentazione
|
||||
|
||||
3. **Validare modifiche**
|
||||
```bash
|
||||
# Test base
|
||||
python -m src.main CU001 A
|
||||
|
||||
# Validazione completa vs MATLAB
|
||||
python -m src.validation.cli CU001 A --output validation_report.txt
|
||||
|
||||
# Verifica report
|
||||
cat validation_report.txt | grep "VALIDATION"
|
||||
```
|
||||
|
||||
4. **Commit e tag**
|
||||
```bash
|
||||
git add src/
|
||||
git commit -m "Sync Python from MATLAB changes - $(date +%Y-%m-%d)"
|
||||
git tag python-sync-$(date +%Y%m%d)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📚 Riferimenti
|
||||
|
||||
- **Mapping completo**: [MATLAB_SYNC_GUIDE.md](MATLAB_SYNC_GUIDE.md)
|
||||
- **Quick reference**: [sync_matlab_changes.md](sync_matlab_changes.md)
|
||||
- **Validation guide**: [README.md#validation](README.md#validation)
|
||||
|
||||
---
|
||||
|
||||
## 💡 Note
|
||||
|
||||
- I file MATLAB sono già stati committati nel repository
|
||||
- Questo è un commit separato che richiede sync Python
|
||||
- Dopo sync Python, eseguire validazione per verificare equivalenza
|
||||
|
||||
---
|
||||
|
||||
*File generato automaticamente - Non modificare manualmente*
|
||||
*Timestamp: $(date +"%Y-%m-%d %H:%M:%S")*
|
||||
|
||||
EOF
|
||||
|
||||
print_success "Richiesta salvata: ${REQUEST_FILE}"
|
||||
|
||||
# ------------------------------------------------
|
||||
# Step 5: Commit MATLAB changes
|
||||
# ------------------------------------------------
|
||||
print_step 5 6 "Commit modifiche MATLAB"
|
||||
|
||||
SYNC_DATE=$(date +"%Y-%m-%d %H:%M:%S")
|
||||
COMMIT_MSG="Sync from remote server: ${SYNC_DATE}"
|
||||
|
||||
git commit -m "${COMMIT_MSG}" -m "Files changed: ${CHANGED_COUNT}" -m "$(echo "$CHANGED_FILES")" 2>/dev/null
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
MATLAB_COMMIT=$(git rev-parse --short HEAD)
|
||||
print_success "Commit MATLAB completato (${MATLAB_COMMIT})"
|
||||
else
|
||||
print_error "Nessuna modifica da committare (potrebbe essere già committato)"
|
||||
MATLAB_COMMIT="N/A"
|
||||
fi
|
||||
|
||||
# ------------------------------------------------
|
||||
# Step 6: Summary e istruzioni
|
||||
# ------------------------------------------------
|
||||
print_step 6 6 "Preparazione finale"
|
||||
|
||||
# Copia negli appunti se xclip disponibile
|
||||
CLIPBOARD_COPIED=false
|
||||
if command -v xclip &> /dev/null; then
|
||||
cat "$REQUEST_FILE" | xclip -selection clipboard 2>/dev/null && CLIPBOARD_COPIED=true
|
||||
if [ "$CLIPBOARD_COPIED" = true ]; then
|
||||
print_success "Richiesta copiata negli appunti"
|
||||
fi
|
||||
fi
|
||||
|
||||
# ================================================
|
||||
# SUMMARY FINALE
|
||||
# ================================================
|
||||
|
||||
print_header "Sincronizzazione Completata"
|
||||
|
||||
echo -e "${BOLD}Status:${NC}"
|
||||
print_success "File MATLAB sincronizzati: ${CHANGED_COUNT}"
|
||||
print_success "Commit MATLAB: ${MATLAB_COMMIT}"
|
||||
print_success "File richiesta Claude: ${REQUEST_FILE}"
|
||||
[ "$CLIPBOARD_COPIED" = true ] && print_success "Richiesta negli appunti: Pronta per essere incollata"
|
||||
|
||||
echo ""
|
||||
echo -e "${BOLD}${YELLOW}⚠️ Prossimi Step - AZIONE RICHIESTA:${NC}"
|
||||
echo ""
|
||||
echo -e " ${BLUE}1.${NC} Aprire Claude Code"
|
||||
echo -e " ${BLUE}2.${NC} Incollare o fornire il file:"
|
||||
echo -e " ${GREEN}${REQUEST_FILE}${NC}"
|
||||
echo -e " ${BLUE}3.${NC} Claude analizzerà e aggiornerà Python automaticamente"
|
||||
echo -e " ${BLUE}4.${NC} Validare con:"
|
||||
echo -e " ${GREEN}python -m src.validation.cli CU001 A${NC}"
|
||||
echo ""
|
||||
|
||||
echo -e "${BOLD}File modificati:${NC}"
|
||||
echo "$CHANGED_FILES" | sed 's/^/ - /'
|
||||
|
||||
echo ""
|
||||
echo -e "${BOLD}Moduli Python da aggiornare:${NC}"
|
||||
for module in "${!affected_modules[@]}"; do
|
||||
echo " - $module"
|
||||
done
|
||||
|
||||
echo ""
|
||||
print_header "Fine"
|
||||
|
||||
# Opzione per aprire file in editor
|
||||
echo -e "${BLUE}Premere ENTER per aprire la richiesta in editor, o CTRL+C per uscire...${NC}"
|
||||
read -r
|
||||
|
||||
# Apri in editor (priorità: $EDITOR, nano, vi)
|
||||
if [ -n "$EDITOR" ]; then
|
||||
$EDITOR "$REQUEST_FILE"
|
||||
elif command -v nano &> /dev/null; then
|
||||
nano "$REQUEST_FILE"
|
||||
elif command -v vi &> /dev/null; then
|
||||
vi "$REQUEST_FILE"
|
||||
else
|
||||
echo "Nessun editor trovato. File disponibile in: $REQUEST_FILE"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
print_success "Processo completato!"
|
||||
echo ""
|
||||
#!/bin/bash
|
||||
#
|
||||
# Script migliorato per sincronizzare file .m da server remoto
|
||||
# e generare richiesta automatica per Claude Code
|
||||
#
|
||||
# Basato su: sync_server_file.sh
|
||||
# Aggiunge: Rilevamento automatico modifiche e generazione richiesta Claude
|
||||
#
|
||||
|
||||
# Configurazione
|
||||
REMOTE_USER="alex"
|
||||
REMOTE_HOST="80.211.60.65"
|
||||
REMOTE_PORT="2022"
|
||||
REMOTE_SRC="/usr/local/matlab_func"
|
||||
LOCAL_DST="/home/alex/devel/matlab-ase"
|
||||
PYTHON_DIR="${LOCAL_DST}/matlab_func"
|
||||
|
||||
# Colori per output
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
BOLD='\033[1m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# ================================================
|
||||
# FUNZIONI UTILITY
|
||||
# ================================================
|
||||
|
||||
print_header() {
|
||||
echo -e "\n${BLUE}${BOLD}========================================${NC}"
|
||||
echo -e "${BLUE}${BOLD}$1${NC}"
|
||||
echo -e "${BLUE}${BOLD}========================================${NC}\n"
|
||||
}
|
||||
|
||||
print_step() {
|
||||
echo -e "${YELLOW}[Step $1/$2]${NC} $3"
|
||||
}
|
||||
|
||||
print_success() {
|
||||
echo -e "${GREEN}✓${NC} $1"
|
||||
}
|
||||
|
||||
print_error() {
|
||||
echo -e "${RED}✗${NC} $1"
|
||||
}
|
||||
|
||||
print_info() {
|
||||
echo -e "${BLUE}→${NC} $1"
|
||||
}
|
||||
|
||||
# Mappa file MATLAB → moduli Python
|
||||
get_affected_module() {
|
||||
local file=$1
|
||||
local basename=$(basename "$file" .m)
|
||||
|
||||
# Mapping patterns
|
||||
case "$basename" in
|
||||
CalcoloRSN*|MediaRSN*|ConvRSN*)
|
||||
echo "RSN" ;;
|
||||
CalcoloTLHR*|CalcoloBL*|CalcoloPL*|CalcoloKLHR*|MediaTilt*|ConvTilt*)
|
||||
echo "Tilt" ;;
|
||||
arot*|asse_a*|asse_b*|qmult*|fqa*)
|
||||
echo "Tilt" ;;
|
||||
CalcoloRL*|CalcoloLL*|CalcoloPL*|Calcolo3DEL*|CalcoloCrL*)
|
||||
echo "ATD" ;;
|
||||
CalcoloBiax*|corrTuL*|CalcoloStella*)
|
||||
echo "ATD" ;;
|
||||
ConvATD*|MediaATD*)
|
||||
echo "ATD" ;;
|
||||
database*|carica_parametri*|carica_calibrazione*)
|
||||
echo "Common" ;;
|
||||
ValidaTemp*|Despiking*)
|
||||
echo "Common" ;;
|
||||
*)
|
||||
echo "Unknown" ;;
|
||||
esac
|
||||
}
|
||||
|
||||
# ================================================
|
||||
# MAIN SCRIPT
|
||||
# ================================================
|
||||
|
||||
print_header "MATLAB → Python Sync Script with Claude Integration"
|
||||
|
||||
# ------------------------------------------------
|
||||
# Step 1: Sincronizzazione MATLAB
|
||||
# ------------------------------------------------
|
||||
print_step 1 6 "Sincronizzazione file MATLAB da server remoto"
|
||||
echo " Host: ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PORT}"
|
||||
echo " Source: ${REMOTE_SRC}"
|
||||
echo " Destination: ${LOCAL_DST}"
|
||||
echo ""
|
||||
|
||||
rsync -avzm -e "ssh -p ${REMOTE_PORT}" \
|
||||
--include='*/' \
|
||||
--include='*.m' \
|
||||
--exclude='*' \
|
||||
"${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_SRC}" "${LOCAL_DST}"
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
print_success "Sincronizzazione completata"
|
||||
else
|
||||
print_error "Errore durante la sincronizzazione Rsync"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# ------------------------------------------------
|
||||
# Step 2: Rilevamento modifiche
|
||||
# ------------------------------------------------
|
||||
print_step 2 6 "Rilevamento modifiche nei file MATLAB"
|
||||
|
||||
cd "${PYTHON_DIR}" || exit 1
|
||||
|
||||
# Aggiungi file .m all'area di staging
|
||||
find "${LOCAL_DST}" -type f -name "*.m" -print0 | xargs -0 git add 2>/dev/null
|
||||
|
||||
# Ottieni lista modifiche
|
||||
CHANGED_FILES=$(git diff --staged --name-only | grep "\.m$" || echo "")
|
||||
CHANGED_COUNT=$(echo "$CHANGED_FILES" | grep -v '^$' | wc -l)
|
||||
|
||||
if [ -z "$CHANGED_FILES" ] || [ "$CHANGED_COUNT" -eq 0 ]; then
|
||||
print_success "Nessun file MATLAB modificato - Sistema già sincronizzato"
|
||||
echo ""
|
||||
echo "Nessuna azione richiesta."
|
||||
exit 0
|
||||
fi
|
||||
|
||||
print_success "Rilevati ${CHANGED_COUNT} file modificati"
|
||||
|
||||
# ------------------------------------------------
|
||||
# Step 3: Analisi moduli interessati
|
||||
# ------------------------------------------------
|
||||
print_step 3 6 "Analisi moduli Python interessati"
|
||||
|
||||
declare -A affected_modules
|
||||
for file in $CHANGED_FILES; do
|
||||
module=$(get_affected_module "$file")
|
||||
if [ "$module" != "Unknown" ]; then
|
||||
affected_modules[$module]=1
|
||||
fi
|
||||
done
|
||||
|
||||
echo " Moduli da aggiornare:"
|
||||
for module in "${!affected_modules[@]}"; do
|
||||
print_info "$module"
|
||||
done
|
||||
|
||||
# ------------------------------------------------
|
||||
# Step 4: Generazione richiesta per Claude
|
||||
# ------------------------------------------------
|
||||
print_step 4 6 "Generazione richiesta per Claude Code"
|
||||
|
||||
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
||||
REQUEST_FILE="${PYTHON_DIR}/CLAUDE_SYNC_REQUEST_${TIMESTAMP}.md"
|
||||
|
||||
# Crea richiesta formattata
|
||||
cat > "$REQUEST_FILE" <<EOF
|
||||
# Richiesta Sincronizzazione MATLAB → Python
|
||||
|
||||
**Generato automaticamente da**: sync_server_file_enhanced.sh
|
||||
**Data**: $(date +"%Y-%m-%d %H:%M:%S")
|
||||
**File modificati**: ${CHANGED_COUNT}
|
||||
|
||||
---
|
||||
|
||||
## 📋 File MATLAB Modificati
|
||||
|
||||
\`\`\`
|
||||
$CHANGED_FILES
|
||||
\`\`\`
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Moduli Python Interessati
|
||||
|
||||
EOF
|
||||
|
||||
for module in "${!affected_modules[@]}"; do
|
||||
case "$module" in
|
||||
RSN)
|
||||
echo "- **RSN Module** → \`src/rsn/\`" >> "$REQUEST_FILE"
|
||||
echo " - Files: elaboration.py, conversion.py, averaging.py, db_write.py" >> "$REQUEST_FILE"
|
||||
;;
|
||||
Tilt)
|
||||
echo "- **Tilt Module** → \`src/tilt/\`" >> "$REQUEST_FILE"
|
||||
echo " - Files: elaboration.py, conversion.py, averaging.py, geometry.py, db_write.py" >> "$REQUEST_FILE"
|
||||
;;
|
||||
ATD)
|
||||
echo "- **ATD Module** → \`src/atd/\`" >> "$REQUEST_FILE"
|
||||
echo " - Files: elaboration.py, conversion.py, averaging.py, db_write.py, star_calculation.py" >> "$REQUEST_FILE"
|
||||
;;
|
||||
Common)
|
||||
echo "- **Common Module** → \`src/common/\`" >> "$REQUEST_FILE"
|
||||
echo " - Files: database.py, config.py, validators.py" >> "$REQUEST_FILE"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
cat >> "$REQUEST_FILE" <<'EOF'
|
||||
|
||||
---
|
||||
|
||||
## 📝 Preview Modifiche (prime 30 righe per file)
|
||||
|
||||
EOF
|
||||
|
||||
for file in $CHANGED_FILES; do
|
||||
# Ottieni path relativo
|
||||
rel_path=$(echo "$file" | sed "s|${LOCAL_DST}/||")
|
||||
|
||||
cat >> "$REQUEST_FILE" <<EOF
|
||||
|
||||
### 📄 ${rel_path}
|
||||
|
||||
\`\`\`diff
|
||||
EOF
|
||||
|
||||
# Aggiungi diff (massimo 30 righe)
|
||||
git diff --staged "$file" 2>/dev/null | head -n 30 >> "$REQUEST_FILE" || echo "No diff available" >> "$REQUEST_FILE"
|
||||
|
||||
echo '```' >> "$REQUEST_FILE"
|
||||
done
|
||||
|
||||
cat >> "$REQUEST_FILE" <<'EOF'
|
||||
|
||||
---
|
||||
|
||||
## ✅ Azione Richiesta
|
||||
|
||||
Aggiornare il codice Python corrispondente ai file MATLAB modificati sopra.
|
||||
|
||||
### Workflow Suggerito
|
||||
|
||||
1. **Analizzare modifiche MATLAB**
|
||||
- Leggere i file modificati
|
||||
- Identificare cambiamenti negli algoritmi
|
||||
- Verificare nuovi parametri o modifiche formule
|
||||
|
||||
2. **Applicare modifiche Python**
|
||||
- Aggiornare funzioni Python corrispondenti
|
||||
- Mantenere coerenza con architettura esistente
|
||||
- Aggiungere type hints e documentazione
|
||||
|
||||
3. **Validare modifiche**
|
||||
```bash
|
||||
# Test base
|
||||
python -m src.main CU001 A
|
||||
|
||||
# Validazione completa vs MATLAB
|
||||
python -m src.validation.cli CU001 A --output validation_report.txt
|
||||
|
||||
# Verifica report
|
||||
cat validation_report.txt | grep "VALIDATION"
|
||||
```
|
||||
|
||||
4. **Commit e tag**
|
||||
```bash
|
||||
git add src/
|
||||
git commit -m "Sync Python from MATLAB changes - $(date +%Y-%m-%d)"
|
||||
git tag python-sync-$(date +%Y%m%d)
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📚 Riferimenti
|
||||
|
||||
- **Mapping completo**: [MATLAB_SYNC_GUIDE.md](MATLAB_SYNC_GUIDE.md)
|
||||
- **Quick reference**: [sync_matlab_changes.md](sync_matlab_changes.md)
|
||||
- **Validation guide**: [README.md#validation](README.md#validation)
|
||||
|
||||
---
|
||||
|
||||
## 💡 Note
|
||||
|
||||
- I file MATLAB sono già stati committati nel repository
|
||||
- Questo è un commit separato che richiede sync Python
|
||||
- Dopo sync Python, eseguire validazione per verificare equivalenza
|
||||
|
||||
---
|
||||
|
||||
*File generato automaticamente - Non modificare manualmente*
|
||||
*Timestamp: $(date +"%Y-%m-%d %H:%M:%S")*
|
||||
|
||||
EOF
|
||||
|
||||
print_success "Richiesta salvata: ${REQUEST_FILE}"
|
||||
|
||||
# ------------------------------------------------
|
||||
# Step 5: Commit MATLAB changes
|
||||
# ------------------------------------------------
|
||||
print_step 5 6 "Commit modifiche MATLAB"
|
||||
|
||||
SYNC_DATE=$(date +"%Y-%m-%d %H:%M:%S")
|
||||
COMMIT_MSG="Sync from remote server: ${SYNC_DATE}"
|
||||
|
||||
git commit -m "${COMMIT_MSG}" -m "Files changed: ${CHANGED_COUNT}" -m "$(echo "$CHANGED_FILES")" 2>/dev/null
|
||||
|
||||
if [ $? -eq 0 ]; then
|
||||
MATLAB_COMMIT=$(git rev-parse --short HEAD)
|
||||
print_success "Commit MATLAB completato (${MATLAB_COMMIT})"
|
||||
else
|
||||
print_error "Nessuna modifica da committare (potrebbe essere già committato)"
|
||||
MATLAB_COMMIT="N/A"
|
||||
fi
|
||||
|
||||
# ------------------------------------------------
|
||||
# Step 6: Summary e istruzioni
|
||||
# ------------------------------------------------
|
||||
print_step 6 6 "Preparazione finale"
|
||||
|
||||
# Copia negli appunti se xclip disponibile
|
||||
CLIPBOARD_COPIED=false
|
||||
if command -v xclip &> /dev/null; then
|
||||
cat "$REQUEST_FILE" | xclip -selection clipboard 2>/dev/null && CLIPBOARD_COPIED=true
|
||||
if [ "$CLIPBOARD_COPIED" = true ]; then
|
||||
print_success "Richiesta copiata negli appunti"
|
||||
fi
|
||||
fi
|
||||
|
||||
# ================================================
|
||||
# SUMMARY FINALE
|
||||
# ================================================
|
||||
|
||||
print_header "Sincronizzazione Completata"
|
||||
|
||||
echo -e "${BOLD}Status:${NC}"
|
||||
print_success "File MATLAB sincronizzati: ${CHANGED_COUNT}"
|
||||
print_success "Commit MATLAB: ${MATLAB_COMMIT}"
|
||||
print_success "File richiesta Claude: ${REQUEST_FILE}"
|
||||
[ "$CLIPBOARD_COPIED" = true ] && print_success "Richiesta negli appunti: Pronta per essere incollata"
|
||||
|
||||
echo ""
|
||||
echo -e "${BOLD}${YELLOW}⚠️ Prossimi Step - AZIONE RICHIESTA:${NC}"
|
||||
echo ""
|
||||
echo -e " ${BLUE}1.${NC} Aprire Claude Code"
|
||||
echo -e " ${BLUE}2.${NC} Incollare o fornire il file:"
|
||||
echo -e " ${GREEN}${REQUEST_FILE}${NC}"
|
||||
echo -e " ${BLUE}3.${NC} Claude analizzerà e aggiornerà Python automaticamente"
|
||||
echo -e " ${BLUE}4.${NC} Validare con:"
|
||||
echo -e " ${GREEN}python -m src.validation.cli CU001 A${NC}"
|
||||
echo ""
|
||||
|
||||
echo -e "${BOLD}File modificati:${NC}"
|
||||
echo "$CHANGED_FILES" | sed 's/^/ - /'
|
||||
|
||||
echo ""
|
||||
echo -e "${BOLD}Moduli Python da aggiornare:${NC}"
|
||||
for module in "${!affected_modules[@]}"; do
|
||||
echo " - $module"
|
||||
done
|
||||
|
||||
echo ""
|
||||
print_header "Fine"
|
||||
|
||||
# Opzione per aprire file in editor
|
||||
echo -e "${BLUE}Premere ENTER per aprire la richiesta in editor, o CTRL+C per uscire...${NC}"
|
||||
read -r
|
||||
|
||||
# Apri in editor (priorità: $EDITOR, nano, vi)
|
||||
if [ -n "$EDITOR" ]; then
|
||||
$EDITOR "$REQUEST_FILE"
|
||||
elif command -v nano &> /dev/null; then
|
||||
nano "$REQUEST_FILE"
|
||||
elif command -v vi &> /dev/null; then
|
||||
vi "$REQUEST_FILE"
|
||||
else
|
||||
echo "Nessun editor trovato. File disponibile in: $REQUEST_FILE"
|
||||
fi
|
||||
|
||||
echo ""
|
||||
print_success "Processo completato!"
|
||||
echo ""
|
||||
|
||||
Reference in New Issue
Block a user