@@ -110,9 +110,10 @@ def draw_session_plots(df_to_draw_session):
110110 except :
111111 date_str = key ["session_date" ].split ("T" )[0 ]
112112
113- st .markdown (f'''<h5 style='text-align: center; color: orange;'>{ key ["subject_id" ]} ({ key ["PI" ]} ), Session { int (key ["session" ])} , { date_str } '''
114- f'''( { key ["trainer" ]} @ { key ["data_source" ]} )''' ,
113+ st .markdown (f'''<h6 style='text-align: center; color: orange;'>{ key ["subject_id" ]} ({ key ["PI" ]} ), { date_str } , Session { int (key ["session" ])} <br> '''
114+ f'''{ key ["trainer" ]} @ { key [ "rig" ] } ( { key ["data_source" ]} )''' ,
115115 unsafe_allow_html = True )
116+
116117 if len (st .session_state .session_plot_selected_draw_types ) > 1 : # more than one types, use the pre-defined layout
117118 for row , column_setting in enumerate (draw_type_layout_definition ):
118119 rows .append (this_major_col .columns (column_setting ))
@@ -133,7 +134,7 @@ def draw_session_plots(df_to_draw_session):
133134 my_bar .progress (int ((i + 1 ) / len (df_to_draw_session ) * 100 ))
134135
135136
136- def session_plot_settings (df_selected , need_click = True ):
137+ def session_plot_settings (df_selected_from_plotly = None , need_click = True ):
137138 with st .form (key = 'session_plot_settings' ):
138139 st .markdown ('##### Show plots for individual sessions ' )
139140 cols = st .columns ([2 , 6 , 1 ])
@@ -146,10 +147,14 @@ def session_plot_settings(df_selected, need_click=True):
146147 default = session_plot_modes [0 ],
147148 key = 'session_plot_mode' ,
148149 )
149-
150- n_session_to_draw = len (df_selected ) \
151- if 'selected from table or plot' in st .session_state .selected_draw_sessions \
152- else len (st .session_state .df_session_filtered )
150+
151+ if "selected" in st .session_state .selected_draw_sessions :
152+ if df_selected_from_plotly is None : # Selected from dataframe
153+ df_to_draw_sessions = st .session_state .df_selected_from_dataframe
154+ else :
155+ df_to_draw_sessions = df_selected_from_plotly
156+ else : # all sessions filtered from sidebar
157+ df_to_draw_sessions = st .session_state .df_session_filtered
153158
154159 _ = number_input_wrapper_for_url_query (
155160 st_prefix = cols [2 ],
@@ -177,20 +182,20 @@ def session_plot_settings(df_selected, need_click=True):
177182 key = 'session_plot_selected_draw_types' ,
178183 )
179184
180- cols [0 ].markdown (f'{ n_session_to_draw } sessions to draw' )
185+ cols [0 ].markdown (f'{ len ( df_to_draw_sessions ) } sessions to draw' )
181186 draw_it_now_override = cols [2 ].checkbox ('Auto show' , value = not need_click , disabled = not need_click )
182187 submitted = cols [0 ].form_submit_button (
183188 "Update settings" , type = "primary"
184189 )
185190
186191 if not need_click :
187- return True
192+ return True , df_to_draw_sessions
188193
189194 if draw_it_now_override :
190- return True
195+ return True , df_to_draw_sessions
191196
192- draw_it = st .button (f'Show { n_session_to_draw } sessions!' , use_container_width = False , type = "primary" )
193- return draw_it
197+ draw_it = st .button (f'Show { len ( df_to_draw_sessions ) } sessions!' , use_container_width = False , type = "primary" )
198+ return draw_it , df_to_draw_sessions
194199
195200
196201def plot_x_y_session ():
@@ -335,12 +340,12 @@ def init(if_load_bpod_data_override=None, if_load_docDB_override=None):
335340 st .session_state .curriculum_manager = curriculum_manager
336341
337342 # Some ad-hoc modifications on df_sessions
338- _df = st .session_state .df ['sessions_main' ] # temporary df alias
343+ _df = st .session_state .df ['sessions_main' ]. copy () # temporary df alias
339344
340345 _df .columns = _df .columns .get_level_values (1 )
341346 _df .sort_values (['session_start_time' ], ascending = False , inplace = True )
342347 _df ['session_start_time' ] = _df ['session_start_time' ].astype (str ) # Turn to string
343- _df = _df .reset_index (). query ( 'subject_id != "0"' )
348+ _df = _df .reset_index ()
344349
345350 # Handle mouse and user name
346351 if 'bpod_backup_h2o' in _df .columns :
@@ -361,7 +366,6 @@ def init(if_load_bpod_data_override=None, if_load_docDB_override=None):
361366 (_df ["trainer" ].isin (_df ["PI" ]) | _df ["trainer" ].isin (["Han Hou" , "Marton Rozsa" ])),
362367 "trainer"
363368 ] # Fill in PI with trainer if PI is missing and the trainer was ever a PI
364-
365369
366370 # Add data source (Room + Hardware etc)
367371 _df [['institute' , 'rig_type' , 'room' , 'hardware' , 'data_source' ]] = _df ['rig' ].apply (lambda x : pd .Series (get_data_source (x )))
@@ -373,10 +377,10 @@ def init(if_load_bpod_data_override=None, if_load_docDB_override=None):
373377 # Remove invalid subject_id
374378 _df = _df [(999999 > _df ["subject_id" ].astype (int ))
375379 & (_df ["subject_id" ].astype (int ) > 300000 )]
376-
380+
377381 # Remove zero finished trials
378382 _df = _df [_df ['finished_trials' ] > 0 ]
379-
383+
380384 # Remove abnormal values
381385 _df .loc [_df ['weight_after' ] > 100 ,
382386 ['weight_after' , 'weight_after_ratio' , 'water_in_session_total' , 'water_after_session' , 'water_day_total' ]
@@ -411,7 +415,28 @@ def init(if_load_bpod_data_override=None, if_load_docDB_override=None):
411415
412416 # last day's total water
413417 _df ['water_day_total_last_session' ] = _df .groupby ('subject_id' )['water_day_total' ].shift (1 )
414- _df ['water_after_session_last_session' ] = _df .groupby ('subject_id' )['water_after_session' ].shift (1 )
418+ _df ['water_after_session_last_session' ] = _df .groupby ('subject_id' )['water_after_session' ].shift (1 )
419+
420+
421+ # -- overwrite the `if_stage_overriden_by_trainer`
422+ # Previously it was set to True if the trainer changes stage during a session.
423+ # But it is more informative to define it as whether the trainer has overridden the curriculum.
424+ # In other words, it is set to True only when stage_suggested ~= stage_actual, as defined in the autotrain curriculum.
425+ _df .drop (columns = ['if_overriden_by_trainer' ], inplace = True )
426+ tmp_auto_train = auto_train_manager .df_manager .query ('if_closed_loop == True' )[
427+ [
428+ "subject_id" ,
429+ "session_date" ,
430+ "current_stage_suggested" ,
431+ "if_stage_overriden_by_trainer" ,
432+ ]
433+ ].copy ()
434+ tmp_auto_train ['session_date' ] = pd .to_datetime (tmp_auto_train ['session_date' ])
435+ _df = _df .merge (
436+ tmp_auto_train ,
437+ on = ["subject_id" , "session_date" ],
438+ how = 'left' ,
439+ )
415440
416441 # fill nan for autotrain fields
417442 filled_values = {'curriculum_name' : 'None' ,
@@ -420,7 +445,6 @@ def init(if_load_bpod_data_override=None, if_load_docDB_override=None):
420445 'current_stage_actual' : 'None' ,
421446 'has_video' : False ,
422447 'has_ephys' : False ,
423- 'if_overriden_by_trainer' : False ,
424448 }
425449 _df .fillna (filled_values , inplace = True )
426450
@@ -436,9 +460,6 @@ def init(if_load_bpod_data_override=None, if_load_docDB_override=None):
436460 # drop 'bpod_backup_' columns
437461 _df .drop ([col for col in _df .columns if 'bpod_backup_' in col ], axis = 1 , inplace = True )
438462
439- # fix if_overriden_by_trainer
440- _df ['if_overriden_by_trainer' ] = _df ['if_overriden_by_trainer' ].astype (bool )
441-
442463 # _df = _df.merge(
443464 # diff_relative_weight_next_day, how='left', on=['subject_id', 'session'])
444465
@@ -567,7 +588,7 @@ def app():
567588 return
568589
569590 aggrid_outputs = aggrid_interactive_table_session (
570- df = st .session_state .df_session_filtered ,
591+ df = st .session_state .df_session_filtered . round ( 3 ) ,
571592 table_height = table_height ,
572593 )
573594
@@ -604,13 +625,7 @@ def add_main_tabs():
604625 # Add session_plot_setting
605626 with st .columns ([1 ])[0 ]:
606627 st .markdown ("***" )
607- if_draw_all_sessions = session_plot_settings (df_selected_from_plotly )
608-
609- df_to_draw_sessions = (
610- df_selected_from_plotly
611- if "selected" in st .session_state .get ("selected_draw_sessions" , "sessions selected from table or plot" )
612- else st .session_state .df_session_filtered
613- )
628+ if_draw_all_sessions , df_to_draw_sessions = session_plot_settings (df_selected_from_plotly = df_selected_from_plotly , need_click = True )
614629
615630 if if_draw_all_sessions and len (df_to_draw_sessions ):
616631 draw_session_plots (df_to_draw_sessions )
@@ -650,13 +665,8 @@ def add_main_tabs():
650665 with placeholder :
651666 cols = st .columns ([1 ])
652667 with cols [0 ]:
653- df_to_draw_sessions = (
654- st .session_state .df_selected_from_dataframe
655- if "selected" in st .session_state .get ("selected_draw_sessions" , "sessions selected from table or plot" )
656- else st .session_state .df_session_filtered
657- )
658- if_draw_all_sessions = session_plot_settings (
659- df_to_draw_sessions , need_click = False
668+ if_draw_all_sessions , df_to_draw_sessions = session_plot_settings (
669+ df_selected_from_plotly = None , need_click = False
660670 )
661671
662672 if if_draw_all_sessions and len (df_to_draw_sessions ):
@@ -769,10 +779,17 @@ def add_main_tabs():
769779 # st.dataframe(st.session_state.df_session_filtered, use_container_width=True, height=1000)
770780
771781if __name__ == "__main__" :
772- ok = True
773- if 'df' not in st .session_state or 'sessions_main' not in st .session_state .df .keys ():
774- ok = init ()
775-
776- if ok :
777- app ()
778- pass
782+ try :
783+ ok = True
784+ if 'df' not in st .session_state or 'sessions_main' not in st .session_state .df .keys ():
785+ ok = init ()
786+
787+ if ok :
788+ app ()
789+ pass
790+ except Exception as e :
791+ st .markdown ('# Something went wrong! :scream: ' )
792+ st .markdown ('## :bulb: Please follow these steps to troubleshoot:' )
793+ st .markdown ('#### 1. Reload the page' )
794+ st .markdown ('#### 2. Click this original URL https://foraging-behavior-browser.allenneuraldynamics-test.org/' )
795+ st .markdown ('#### 3. Report your bug here: https://github.com/AllenNeuralDynamics/foraging-behavior-browser/issues (paste your URL and screenshoots)' )
0 commit comments