AphasiaPred / direct_fc_visualization.py
SreekarB's picture
Upload 7 files
50c6714 verified
#!/usr/bin/env python
"""
Direct FC Matrix Visualization Script.
This script creates and visualizes FC matrices directly, without relying on fMRI data.
It uses the consolidated visualization utilities.
"""
import os
import numpy as np
# Configure matplotlib for headless environment
import matplotlib
matplotlib.use('Agg') # Use non-interactive backend
import matplotlib.pyplot as plt
from visualization import vector_to_matrix, plot_fc_matrices
def create_synthetic_fc_matrices(n_subjects=10, n_rois=264, seed=42):
"""
Create synthetic FC matrices for visualization.
Args:
n_subjects: Number of synthetic subjects
n_rois: Number of regions of interest
seed: Random seed for reproducibility
Returns:
dict: Dictionary with original FC matrices, latent features, and reconstructions
"""
np.random.seed(seed)
# Calculate the size of upper triangular part
n_triu = n_rois * (n_rois - 1) // 2
# Create synthetic FC matrices
print(f"Creating {n_subjects} synthetic FC matrices with {n_rois} ROIs each")
# Create original FC matrices (upper triangular vectors)
original_fc_vectors = []
for i in range(n_subjects):
# Create random correlation values
np.random.seed(seed + i) # For reproducibility
# Generate values between -0.8 and 0.8 (typical FC range)
fc_triu = np.random.rand(n_triu) * 1.6 - 0.8
original_fc_vectors.append(fc_triu)
# Simulate latent features (much lower dimensional)
latent_dim = 16
latent_features = np.random.randn(n_subjects, latent_dim)
# Simulate reconstructions with some error
reconstructed_fc_vectors = []
for i in range(n_subjects):
# Add some noise to original to simulate reconstruction error
recon = original_fc_vectors[i] + np.random.randn(n_triu) * 0.1
# Clip to realistic correlation range
recon = np.clip(recon, -0.99, 0.99)
reconstructed_fc_vectors.append(recon)
# Simulate a newly generated FC matrix
generated_fc_vector = np.random.rand(n_triu) * 1.6 - 0.8
return {
'original_vectors': original_fc_vectors,
'reconstructed_vectors': reconstructed_fc_vectors,
'generated_vector': generated_fc_vector,
'latent_features': latent_features
}
def calculate_metrics(original, reconstructed):
"""
Calculate reconstruction metrics
Args:
original: Original FC matrix
reconstructed: Reconstructed FC matrix
Returns:
dict: Dictionary of metrics
"""
from sklearn.metrics import mean_squared_error, r2_score
# Flatten matrices
orig_flat = original.flatten()
recon_flat = reconstructed.flatten()
# Calculate metrics
mse = mean_squared_error(orig_flat, recon_flat)
rmse = np.sqrt(mse)
r2 = r2_score(orig_flat, recon_flat)
corr = np.corrcoef(orig_flat, recon_flat)[0, 1]
return {
'MSE': mse,
'RMSE': rmse,
'R²': r2,
'Correlation': corr
}
def main():
"""Run the visualization script"""
print("Creating direct FC matrix visualization without fMRI data")
# Create synthetic FC data
fc_data = create_synthetic_fc_matrices(n_subjects=10)
# Get the vectors for visualization
original_vector = fc_data['original_vectors'][0]
reconstructed_vector = fc_data['reconstructed_vectors'][0]
generated_vector = fc_data['generated_vector']
# Create visualization using the consolidated function
fig = plot_fc_matrices(original_vector, reconstructed_vector, generated_vector)
# Save the figure
output_file = "fc_visualization.png"
fig.savefig(output_file, dpi=300, bbox_inches='tight')
print(f"Saved visualization to {output_file}")
# Save matrices for inspection
original_matrix = vector_to_matrix(original_vector)
reconstructed_matrix = vector_to_matrix(reconstructed_vector)
generated_matrix = vector_to_matrix(generated_vector)
np.save('original_fc.npy', original_matrix)
np.save('reconstructed_fc.npy', reconstructed_matrix)
np.save('generated_fc.npy', generated_matrix)
print("Saved matrices to NPY files")
# Calculate and display metrics
metrics = calculate_metrics(original_matrix, reconstructed_matrix)
print("\nFC Reconstruction Metrics:")
for name, value in metrics.items():
print(f" {name}: {value:.6f}")
print("\nVisualization complete!")
if __name__ == "__main__":
main()