11import os
2+ import glob
23import pandas as pd
34import plotly .graph_objects as go
45import logging
@@ -13,7 +14,7 @@ class Group:
1314 def __init__ (self ):
1415 self .obs_path = Pipe .OBS_DIR
1516 self .int_path = Pipe .INT_DIR
16- self .paths = [os .path .join (self .obs_path ,'derivatives' , 'GGIR-3.2.6-test' ), os .path .join (self .int_path , 'derivatives' , 'GGIR-3.2.6-test' )]
17+ self .paths = [os .path .join (self .obs_path ,'derivatives' , 'GGIR-3.2.6-test-ncp-sleep ' ), os .path .join (self .int_path , 'derivatives' , 'GGIR-3.2.6-test-ncp-sleep ' )]
1718 self .path = './plots/group'
1819
1920 '''
@@ -47,11 +48,13 @@ def _parse_person_file(self, file_path):
4748 if df .empty :
4849 logger .warning (f"{ file_path } is empty." )
4950 return None
51+ session = df .get ("filename" , ["" ])[0 ].split ("_" )[- 2 ] if "filename" in df else "unknown"
5052 return {
5153 "Sleep" : sleep / total * 1440 ,
5254 "Inactivity" : inactivity / total * 1440 ,
5355 "Light" : light / total * 1440 ,
54- "MVPA" : mvpa / total * 1440
56+ "MVPA" : mvpa / total * 1440 ,
57+ "Session" : session
5558 }
5659 except Exception as e :
5760 logger .warning (f"Error reading file { file_path } : { e } " )
@@ -66,21 +69,23 @@ def plot_person(self):
6669 if not entry .startswith ("sub-" ):
6770 continue
6871
69- person_file = os .path .join (
70- base_dir , entry , "accel" , "output_accel" , "results" ,
71- "part5_personsummary_MM_L40M100V400_T5A5.csv "
72+ results_dir = os .path .join (
73+ base_dir , entry ,
74+ "accel" , "output_accel" , "results "
7275 )
73-
74- if not os .path .isfile (person_file ):
75- logger .debug (f"File not found for { entry } , skipping." )
76+ pattern = os .path .join (results_dir , "part5_personsummary_MM*.csv" )
77+ matches = glob .glob (pattern )
78+ if not matches :
79+ logger .debug (f"No matching files in { results_dir } , skipping { entry } " )
7680 continue
7781
78- values = self ._parse_person_file (person_file )
79- if not values :
80- continue
82+ for person_file in matches :
83+ values = self ._parse_person_file (person_file )
84+ if not values :
85+ continue
8186
82- values ["Subject" ] = entry
83- durations .append (values )
87+ values ["Subject" ] = entry
88+ durations .append (values )
8489
8590 df_all = pd .DataFrame (durations )
8691 if not df_all .empty and "Subject" in df_all .columns :
@@ -89,9 +94,13 @@ def plot_person(self):
8994 else :
9095 logger .warning ("No valid data found — skipping Subject filtering." )
9196
92- self ._plot_stacked_bar (df_all ,
93- title = "Normalized Average Activity Composition by Subject (All Sessions)" ,
94- filename = "avg_plot_all.html" )
97+ self ._plot_stacked_bar (
98+ df_all ,
99+ title = "Normalized Average Activity Composition by Subject (All Sessions)" ,
100+ filename = "avg_plot_all.html"
101+ )
102+
103+
95104 def plot_session (self ):
96105 durations = []
97106
@@ -108,28 +117,29 @@ def plot_session(self):
108117 if not session_folder .startswith ("ses" ):
109118 continue
110119
111- person_file = os .path .join (
120+ results_dir = os .path .join (
112121 subject_path ,
113122 session_folder ,
114123 f"output_{ session_folder } " ,
115- "results" ,
116- "part5_personsummary_MM_L40M100V400_T5A5.csv"
124+ "results"
117125 )
118-
119- if not os .path .isfile (person_file ):
120- logger .debug (f"Missing file for { entry } /{ session_folder } , skipping." )
126+ pattern = os .path .join (results_dir , "part5_personsummary_MM*.csv" )
127+ matches = glob .glob (pattern )
128+ if not matches :
129+ logger .debug (f"No matching files in { results_dir } , skipping { entry } /{ session_folder } " )
121130 continue
122131
123- values = self ._parse_person_file (person_file )
124- if not values :
125- continue
132+ for person_file in matches :
133+ values = self ._parse_person_file (person_file )
134+ if not values :
135+ continue
126136
127- values ["Subject" ] = entry
128- values ["Session" ] = session_folder
129- durations .append (values )
137+ values ["Subject" ] = entry
138+ values ["Session" ] = session_folder
139+ durations .append (values )
130140
131141 df_all = pd .DataFrame (durations )
132- if not df_all .empty and "Subject" in df_all . columns and "Session" in df_all .columns :
142+ if not df_all .empty and { "Subject" , "Session" }. issubset ( df_all .columns ) :
133143 df_all = df_all [~ df_all ["Subject" ].str .startswith ("sub-6" )].reset_index (drop = True )
134144 df_all = df_all .sort_values (["Session" , "Subject" ]).reset_index (drop = True )
135145 else :
@@ -142,6 +152,7 @@ def plot_session(self):
142152 y_key = "Subject" ,
143153 filename = f"avg_plot_{ session } .html"
144154 )
155+
145156 def _plot_stacked_bar (self , df , title , filename , y_key = "Subject" ):
146157 if df .empty :
147158 logger .warning ("No data to plot." )
0 commit comments