#!/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()