Files
matlab-python/MIGRATION_GUIDE.md
2025-10-12 20:16:19 +02:00

365 lines
9.5 KiB
Markdown

# Guida alla Migrazione MATLAB → Python
Questo documento fornisce una guida dettagliata per completare la conversione dei moduli MATLAB rimanenti.
## Stato Attuale della Conversione
### ✅ Completato
#### Moduli Comuni
- [x] `database.py` - Connessione e query database
- [x] `config.py` - Gestione configurazione e parametri
- [x] `logging_utils.py` - Sistema di logging
- [x] `validators.py` - Validazione dati
#### Modulo RSN
- [x] `rsn/main.py` - Entry point principale
- [x] `rsn/conversion.py` - Conversione dati grezzi
- [x] `rsn/averaging.py` - Media temporale
- [x] `rsn/elaboration.py` - Elaborazione principale
- [x] `rsn/db_write.py` - Scrittura database
#### Modulo Tilt
- [x] `tilt/geometry.py` - Calcoli geometrici e quaternioni
- [x] `tilt/main.py` - Entry point principale (stub)
#### Modulo ATD
- [x] `atd/star_calculation.py` - Calcolo stella per posizionamento
- [x] `atd/main.py` - Entry point principale (stub)
#### Modulo Monitoring
- [x] `monitoring/alerts.py` - Sistema allerte
### ⚠️ Da Completare
#### Modulo RSN
- [ ] `rsn/data_processing.py` - Implementazione completa caricamento dati
- [ ] `rsn/sensors/` - Moduli specifici per ogni tipo di sensore
#### Modulo Tilt
- [ ] `tilt/data_processing.py` - Caricamento e definizione dati
- [ ] `tilt/conversion.py` - Conversione dati grezzi
- [ ] `tilt/averaging.py` - Media dati
- [ ] `tilt/elaboration.py` - Elaborazione principale
- [ ] `tilt/fukuzono.py` - Analisi Fukuzono
- [ ] `tilt/sensors/biaxial.py` - Calcoli biassiali
- [ ] `tilt/db_write.py` - Scrittura database
#### Modulo ATD
- [ ] `atd/data_processing.py` - Caricamento dati
- [ ] `atd/conversion.py` - Conversione sensori
- [ ] `atd/averaging.py` - Media dati
- [ ] `atd/elaboration.py` - Elaborazione
- [ ] `atd/sensors/` - Implementazione sensori specifici
- [ ] `atd/reports/generator.py` - Generazione report
#### Modulo Monitoring
- [ ] `monitoring/thresholds.py` - Gestione soglie
- [ ] `monitoring/battery_check.py` - Controllo batterie
- [ ] `monitoring/notifications.py` - Notifiche SMS/email
## Pattern di Conversione
### 1. Funzioni MATLAB → Python
#### Input/Output
```matlab
% MATLAB
function [output1, output2] = myFunction(input1, input2)
```
```python
# Python
def my_function(input1: type1, input2: type2) -> Tuple[type3, type4]:
"""Docstring describing function."""
return output1, output2
```
#### Indicizzazione Array
```matlab
% MATLAB (1-based)
data(1) % Primo elemento
data(2:5) % Elementi 2-5
data(end) % Ultimo elemento
```
```python
# Python (0-based)
data[0] # Primo elemento
data[1:5] # Elementi 2-5 (esclude 5)
data[-1] # Ultimo elemento
```
#### Matrici e Array
```matlab
% MATLAB
A = zeros(10, 5);
A(i,j) = value;
B = A'; % Trasposta
```
```python
# Python (NumPy)
A = np.zeros((10, 5))
A[i,j] = value
B = A.T # Trasposta
```
### 2. Query Database
#### MATLAB
```matlab
query = 'SELECT * FROM table WHERE id = ?';
data = fetch(conn, query, id);
```
#### Python
```python
query = "SELECT * FROM table WHERE id = %s"
data = conn.execute_query(query, (id,))
```
### 3. File I/O
#### MATLAB
```matlab
data = csvread('file.csv');
xlsread('file.xlsx', 'Sheet1');
```
#### Python
```python
data = np.loadtxt('file.csv', delimiter=',')
df = pd.read_excel('file.xlsx', sheet_name='Sheet1')
```
### 4. Logging
#### MATLAB
```matlab
fileID = fopen(FileName,'a');
fprintf(fileID, '%s\n', text);
fclose(fileID);
```
#### Python
```python
logger.info(text)
# Oppure
with LogFileWriter(filename) as f:
f.write(text)
```
## Conversione File Specifici
### RSN: defDatiRSN.m → data_processing.py
**Obiettivo**: Organizzare dati grezzi dal database in strutture NumPy.
**Passi**:
1. Ricevere lista di dizionari da query database
2. Estrarre timestamp e convertire in array NumPy
3. Organizzare dati sensori per nodo
4. Gestire valori mancanti
5. Applicare despiking iniziale
6. Restituire arrays strutturati
**Esempio**:
```python
def define_rsn_data(raw_data, n_sensors, mems_type):
# Estrarre timestamps
timestamps = np.array([row['timestamp'] for row in raw_data])
# Inizializzare arrays
n_points = len(timestamps) // n_sensors
acc = np.zeros((n_points, n_sensors * (2 if mems_type == 2 else 3)))
temp = np.zeros((n_points, n_sensors))
# Riempire arrays
for i, row in enumerate(raw_data):
point_idx = i // n_sensors
sensor_idx = i % n_sensors
# ... popolare arrays
return timestamps, acc, temp, errors
```
### Tilt: elaborazione_TL.m → elaboration.py
**Obiettivo**: Calcolare spostamenti da dati inclinometrici.
**Passi principali**:
1. Validazione temperature
2. Controllo vettori accelerazione (se MEMS)
3. Applicazione trasformazioni geometriche (usando geometry.py)
4. Calcolo differenziali rispetto a riferimento
5. Gestione errori
**Funzioni chiave da implementare**:
- `elaborate_tilt_link_data()` - Per TL standard
- `elaborate_tilt_link_hr_data()` - Per TLHR alta risoluzione
- `calculate_biaxial_displacements()` - Per sensori biassiali
### ATD: CalcoloBiax_TuL.m → elaboration.py
**Obiettivo**: Calcoli biassiali per Tube Link.
**Elementi specifici**:
- Correlazione fra assi
- Compensazione temperatura
- Calcolo stella per posizionamento spaziale
### Monitoring: checkBattery.m → battery_check.py
**Semplice**: Query database per livello batteria, confronto soglie, invio notifiche.
```python
def check_battery(battery_level, control_unit_id, unit_type, email_list, conn):
status = validate_battery_level(battery_level)
if status == 'critical':
send_notification(
email_list,
subject=f"CRITICAL: Battery {control_unit_id}",
message=f"Battery level: {battery_level}%"
)
```
## Testing
### Test Unitari
Creare test per ogni modulo convertito:
```python
# test_conversion.py
import numpy as np
from src.rsn.conversion import convert_rsn_data
def test_convert_rsn_data_freescale():
# Setup
n_sensors = 2
acc = np.array([[100, 200, 150, 250]]) # Raw ADC
temp = np.array([[2500, 2600]])
cal = np.array([
[0.001, 0, 0.001, 0, 0.1, -50],
[0.001, 0, 0.001, 0, 0.1, -50]
])
mems_type = 2
# Execute
acc_conv, acc_mag, temp_conv = convert_rsn_data(
n_sensors, acc, temp, cal, mems_type
)
# Assert
assert acc_conv.shape == (1, 4)
assert acc_mag.shape == (1, 2)
# ... altri assert
```
### Test di Integrazione
Testare flusso completo con dati reali:
```python
def test_rsn_full_pipeline():
# Usare piccolo subset di dati reali
# Verificare output atteso
pass
```
## Checklist per Ogni File Convertito
- [ ] Docstring completo per funzione/classe
- [ ] Type hints per parametri e return
- [ ] Gestione eccezioni appropriata
- [ ] Logging di operazioni importanti
- [ ] Validazione input
- [ ] Test unitari
- [ ] Documentazione in README
## Priorità di Conversione
### Alta Priorità
1. `rsn/data_processing.py` - Necessario per funzionamento base RSN
2. `tilt/elaboration.py` - Core processing tilt sensors
3. `atd/elaboration.py` - Core processing ATD sensors
4. `monitoring/notifications.py` - Sistema allerte critico
### Media Priorità
5. Moduli sensors specifici
6. Report generation
7. Advanced analytics (Fukuzono, etc.)
### Bassa Priorità
8. Report templates
9. Dashboard integration
10. ML features
## Strumenti Utili
### MATLAB to Python Converter (parziale)
```bash
# Librerie che possono aiutare
pip install matlab2python # Conversione automatica base
pip install smop # Source-to-source compiler
```
⚠️ **Nota**: La conversione automatica produce codice di bassa qualità. Usare solo come riferimento.
### Confronto Output
Per verificare correttezza conversione:
1. Eseguire versione MATLAB e salvare output
2. Eseguire versione Python con stessi input
3. Confrontare risultati numerici
```python
def compare_outputs(matlab_output, python_output, tolerance=1e-6):
diff = np.abs(matlab_output - python_output)
max_diff = np.max(diff)
print(f"Max difference: {max_diff}")
assert max_diff < tolerance, "Outputs differ significantly"
```
## Problemi Comuni e Soluzioni
### 1. Differenze Numeriche
**Problema**: Risultati Python leggermente diversi da MATLAB.
**Cause comuni**:
- Differenze floating point precision
- Ordine operazioni diverse
- Funzioni con implementazioni diverse (es. `round`)
**Soluzione**: Accettare differenze < 1e-6, documentare se maggiori.
### 2. Performance
**Problema**: Codice Python più lento di MATLAB.
**Soluzioni**:
- Usare operazioni vettoriali NumPy invece di loop
- Compilare con Numba (@jit decorator)
- Profilare con cProfile per trovare bottleneck
### 3. Memory Usage
**Problema**: Uso eccessivo memoria.
**Soluzioni**:
- Processare dati in chunks
- Usare dtype appropriati (float32 invece di float64 se possibile)
- Liberare memoria con `del` per arrays grandi
## Risorse
- NumPy Documentation: https://numpy.org/doc/
- Pandas Documentation: https://pandas.pydata.org/docs/
- MySQL Connector Python: https://dev.mysql.com/doc/connector-python/
- Python Type Hints: https://docs.python.org/3/library/typing.html
## Contatti
Per domande sulla conversione, consultare:
- Documentazione codice MATLAB originale
- File di log per capire flusso elaborazione
- Database schema per struttura dati