#!/usr/bin/env python3
import numpy as np
import matplotlib.pyplot as plt
from spicelib import RawRead

# 1. RAW-Datei einlesen
raw_file = "pspice.raw"  # Pfad zu deiner .raw Datei anpassen
lr = RawRead(raw_file)

# Zeige alle verfügbaren Signale im Terminal (falls du andere Knoten brauchst)
print("Verfügbare Signale:", lr.get_trace_names())

# 2. Daten extrahieren (Frequenz ist bei AC immer Index 0 bzw. 'frequency')
freq = lr.get_trace('frequency').get_wave()
vout_complex = lr.get_trace('v(vout)').get_wave()

# Da es sich um eine AC-Simulation handelt, sind die Daten komplex.
# Wir berechnen Magnitude (dB) und Phase (Grad).
#vout_db = 20 * np.log10(np.abs(vout_complex))
vout_phase = np.angle(vout_complex, deg=True)

# 3. Diagramm (Bode-Plot) mit Matplotlib aufbauen
# fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(10, 8), sharex=True)
# Ändere diese Zeile im Skript:
fig, (ax1, ax2) = plt.subplots(2, 1, figsize=(6.4, 4.8), sharex=True)

# --- oberer Plot: Amplitude (dB) ---
#ax1.semilogx(freq, vout_db, color='blue', linewidth=2, label='|V(VOUT)|')
#ax1.set_ylabel('Amplitude (dB)', color='blue')
#ax1.tick_params(axis='y', labelcolor='blue')
#ax1.grid(True, which="both", linestyle="--", alpha=0.7)
#ax1.set_title('Bode-Diagramm aus ngspice Simulation', fontsize=14)

# --- 1. Linearen Wert berechnen (statt dB) ---
# np.abs() liefert den linearen Amplitudenfaktor
vout_linear = np.abs(vout_complex)  

# --- 2. Plot-Bereich für die Amplitude anpassen ---
# Wir plotten nun den linearen Wert auf der Y-Achse
ax1.semilogx(freq, vout_linear, color='blue', linewidth=2, label='|V(VOUT)|')
ax1.set_ylabel('Spannungsverhältnis (V_out / V_in)', color='blue') # Neue Beschriftung
ax1.tick_params(axis='y', labelcolor='blue')
ax1.grid(True, which="both", linestyle="--", alpha=0.7)
ax1.set_title('Bode-Diagramm (Linearer Amplitudengang)', fontsize=11)

# --- unterer Plot: Phase (Grad) ---
ax2.semilogx(freq, vout_phase, color='red', linewidth=1.5, label='Phase')
ax2.set_xlabel('Frequenz (Hz)')
ax2.set_ylabel('Phase (°)', color='red')
ax2.tick_params(axis='y', labelcolor='red')
ax2.grid(True, which="both", linestyle="--", alpha=0.7)

# Layout optimieren und als PNG speichern
plt.tight_layout()
output_png = "spice_bode_plot.png"
plt.savefig(output_png, dpi=100)
print(f"Diagramm erfolgreich als '{output_png}' gespeichert.")
