File size: 4,677 Bytes
01f75cf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import os
from collections import defaultdict

import numpy as np
import pandas as pd

# このファイルのあるディレクトリの絶対パスを取得し、そこから level ディレクトリへの絶対パスを作成
CURRENT_DIR = os.path.dirname(os.path.abspath(__file__))
LEVEL_DIR = os.path.abspath(os.path.join(CURRENT_DIR, "..", "..", "level"))


def change_level(df, level="Type1_Level1", sulcus=True):
    """
    Change the level of the given DataFrame based on specified ROI levels.

    Parameters:
    df (pd.DataFrame): The input DataFrame to be modified.
    level (str): The level to which the DataFrame should be changed. Default is "Type1_Level1".
    sulcus (bool): A flag indicating whether to include sulcus regions. Default is True.

    Returns:
    pd.DataFrame: The modified DataFrame with the specified level changes applied.
    """
    # LEVEL_DIR を基準に CSV ファイルの絶対パスを作成
    ROI_number = pd.read_csv(os.path.join(LEVEL_DIR, "Level_ROI_No.csv"))
    ROI_name = pd.read_csv(os.path.join(LEVEL_DIR, "Level_ROI_Name.csv"))

    if sulcus == False:
        tmp = ROI_number["Type1_Level2"]
        ROI_number = ROI_number[tmp != 18]
        ROI_number = ROI_number[tmp != 19]
        ROI_name = ROI_name[tmp != 18]
        ROI_name = ROI_name[tmp != 19]
    data = dict(zip(ROI_number["ROI"], ROI_number[level]))
    level_dict = defaultdict(list)
    for key, value in data.items():
        level_dict[str(value)].append(key)

    change_df_list = []
    for i, (key, value) in enumerate(level_dict.items()):
        name = ROI_name[level].unique()[i]
        change_df_list.append(df[value].sum(axis=1).rename(name))

    change_df = pd.concat(change_df_list, axis=1)
    return change_df


def make_csv(parcellation, output_dir, basename):
    """
    Generates multiple CSV files containing volume data for different levels of parcellation.

    Parameters:
    parcellation (numpy.ndarray): The parcellation data array where each unique integer represents a different region.
    output_dir (str): The directory where the output CSV files will be saved.
    basename (str): The base name for the output CSV files.

    Returns:
    pandas.DataFrame: The DataFrame containing volume data for Type1_Level5.
    """
    # LEVEL_DIR を基準にテキストファイルの絶対パスを作成
    csv_path = os.path.join(LEVEL_DIR, "Level5.txt")
    df_Type1_level5 = (
        pd.read_table(csv_path, names=["number", "region"]).astype("str").set_index("number")
    )
    for i in range(1, 281):
        volume = np.count_nonzero(parcellation == i)
        df_Type1_level5.loc[str(i), basename] = volume

    df_Type1_level5 = df_Type1_level5.set_index("region").T.reset_index(drop=True)
    df_Type1_level4 = change_level(df_Type1_level5, level="Type1_Level4")
    df_Type1_level3 = change_level(df_Type1_level5, level="Type1_Level3")
    df_Type1_level2 = change_level(df_Type1_level5, level="Type1_Level2")
    df_Type1_level1 = change_level(df_Type1_level5, level="Type1_Level1")

    df_Type2_level5 = change_level(df_Type1_level5, level="Type2_Level5")
    df_Type2_level4 = change_level(df_Type1_level5, level="Type2_Level4")
    df_Type2_level3 = change_level(df_Type1_level5, level="Type2_Level3")
    df_Type2_level2 = change_level(df_Type1_level5, level="Type2_Level2")
    df_Type2_level1 = change_level(df_Type1_level5, level="Type2_Level1")

    os.makedirs(os.path.join(output_dir, "csv"), exist_ok=True)
    df_Type1_level5.to_csv(
        os.path.join(output_dir, f"csv/{basename}_Type1_Level5.csv"), index=False
    )
    df_Type1_level4.to_csv(
        os.path.join(output_dir, f"csv/{basename}_Type1_Level4.csv"), index=False
    )
    df_Type1_level3.to_csv(
        os.path.join(output_dir, f"csv/{basename}_Type1_Level3.csv"), index=False
    )
    df_Type1_level2.to_csv(
        os.path.join(output_dir, f"csv/{basename}_Type1_Level2.csv"), index=False
    )
    df_Type1_level1.to_csv(
        os.path.join(output_dir, f"csv/{basename}_Type1_Level1.csv"), index=False
    )

    df_Type2_level5.to_csv(
        os.path.join(output_dir, f"csv/{basename}_Type2_Level5.csv"), index=False
    )
    df_Type2_level4.to_csv(
        os.path.join(output_dir, f"csv/{basename}_Type2_Level4.csv"), index=False
    )
    df_Type2_level3.to_csv(
        os.path.join(output_dir, f"csv/{basename}_Type2_Level3.csv"), index=False
    )
    df_Type2_level2.to_csv(
        os.path.join(output_dir, f"csv/{basename}_Type2_Level2.csv"), index=False
    )
    df_Type2_level1.to_csv(
        os.path.join(output_dir, f"csv/{basename}_Type2_Level1.csv"), index=False
    )

    return df_Type1_level5