def compare_components_and_plot(images, labels, scoring, force_match=False, out_dir=None): """ For any given pair of ica component images, compute score matrix and plot the matrix. Returns score matrix and sign matrix. """ # Compare components # The sign_mat contains signs that gave the best score for the comparison score_mat, sign_mat = compare_components(images, labels, scoring) # Plot comparison matrix for normalize in [False, True]: plot_comparison_matrix( score_mat, labels, scoring, normalize=normalize, out_dir=out_dir) return score_mat, sign_mat
def load_or_generate_summary(images, term_scores, n_components, scoring, dataset, force=False, sparsityThreshold=0.000005, memory=Memory(cachedir='nilearn_cache')): """ For a given n_components, load summary csvs if they already exist, or run main.py to get and save necessary summary data required for plotting. Returns (wb_summary, R_sparsity, L_sparsity), each of which are DataFrame. """ # Directory to find or save the summary csvs out_dir = op.join('ica_imgs', dataset, 'analyses', str(n_components)) summary_csvs = ["wb_summary.csv", "R_sparsity.csv", "L_sparsity.csv"] # If summary data are already saved as csv files, simply load them if not force and all([op.exists(op.join(out_dir, csv)) for csv in summary_csvs]): print("Loading summary data from %s" % out_dir) (wb_summary, R_sparsity, L_sparsity) = (pd.read_csv(op.join(out_dir, csv)) for csv in summary_csvs) # Otherwise run main.py and save them as csv files else: # Initialize summary DFs (wb_summary, R_sparsity, L_sparsity) = (pd.DataFrame( {"n_comp": [n_components] * n_components}) for i in range(3)) if not op.exists(out_dir): os.makedirs(out_dir) # Use wb matching in main analysis to get component images and # matching scores match_method = 'wb' img_d, score_mats_d, sign_mats_d = do_main_analysis( dataset=dataset, images=images, term_scores=term_scores, key=match_method, force=force, plot=False, n_components=n_components, scoring=scoring) # 1) Get sparsity for each hemisphere for "wb", "R" and "L" imgs hemis = ("R", "L") sparsitySigns = ("pos", "neg", "abs") # Dict of DF and labels used to get and store Sparsity results label_dict = {"wb": (wb_summary, hemis), "R": (R_sparsity, ["R"]), "L": (L_sparsity, ["L"])} for key in label_dict: (df, labels) = label_dict[key] sparsityResults = {label: getHemiSparsity(img_d[key], label, threshold=sparsityThreshold, memory=memory) for label in labels} # {label: (pos_arr, neg_arr, abs_arr)} for i, sign in enumerate(sparsitySigns): for label in labels: df["%s_%s" % (sign, label)] = sparsityResults[label][i] # For wb only, also compute Total sparsity and HPI if key == "wb": df["%sTotal" % sign] = df["%s_R" % sign] + df["%s_L" % sign] df["%sHPI" % sign] = ((df["%s_R" % sign] - df["%s_L" % sign]) / df["%sTotal" % sign].astype(float)) # Save R/L_sparsity DFs R_sparsity.to_csv(op.join(out_dir, "R_sparsity.csv")) L_sparsity.to_csv(op.join(out_dir, "L_sparsity.csv")) # 2) Get SAS of wb component images as well as matched RL images by passing # 2 x wb or RL images and hemi labels to the compare_components (make sure # not to flip when comparing R and L) name_img_pairs = [("wb_SAS", img_d["wb"]), ("matchedRL_SAS", img_d["RL"])] for (name, img) in name_img_pairs: sas_imgs = [img] * 2 score_mat, sign_mat = compare_components(sas_imgs, hemis, scoring, flip=False) # we only care about the diagonal in score_mat wb_summary[name] = score_mat.diagonal() # 3) Finally store indices of matched R, L, and RL components, and the # respective match scores against wb comparisons = [('wb', 'R'), ('wb', 'L'), ('wb', 'RL')] for comparison in comparisons: score_mat, sign_mat = score_mats_d[comparison], sign_mats_d[comparison] matched, unmatched = get_match_idx_pair(score_mat, sign_mat) # Component indices for matched R, L , RL are in matched[1]. # Multiply it by matched[2], which stores sign flipping info. matched_indices = matched[1] * matched[2] wb_summary["matched%s" % comparison[1]] = matched_indices matched_scores = score_mat[matched[0], matched[1]] wb_summary["match%s_score" % comparison[1]] = matched_scores # Save wb_summary wb_summary.to_csv(op.join(out_dir, "wb_summary.csv")) return (wb_summary, R_sparsity, L_sparsity)