@@ -35,11 +35,12 @@ class Controller():
3535 def __init__ (self , analyzer = None , backend = "qt" , parent = None , verbose = False , save_on_compute = False ,
3636 curation = False , curation_data = None , label_definitions = None , with_traces = True ,
3737 displayed_unit_properties = None ,
38- extra_unit_properties = None , skip_extensions = None ):
38+ extra_unit_properties = None , skip_extensions = None , disable_save_settings_button = False ):
3939 self .views = []
4040 skip_extensions = skip_extensions if skip_extensions is not None else []
4141 self .skip_extensions = skip_extensions
4242 self .backend = backend
43+ self .disable_save_settings_button = disable_save_settings_button
4344 if self .backend == "qt" :
4445 from .backend_qt import SignalHandler
4546 self .signal_handler = SignalHandler (self , parent = parent )
@@ -443,6 +444,29 @@ def get_t_start_t_stop(self):
443444 else :
444445 return 0 , self .get_num_samples (segment_index ) / self .sampling_frequency
445446
447+ def get_times_chunk (self , segment_index , t1 , t2 ):
448+ ind1 , ind2 = self .get_chunk_indices (t1 , t2 , segment_index )
449+ if self .main_settings ["use_times" ]:
450+ recording = self .analyzer .recording
451+ times_chunk = recording .get_times (segment_index = segment_index )[ind1 :ind2 ]
452+ else :
453+ times_chunk = np .arange (ind2 - ind1 , dtype = 'float64' ) / self .controller .sampling_frequency + max (t1 , 0 )
454+ return times_chunk
455+
456+ def get_chunk_indices (self , t1 , t2 , segment_index ):
457+ if self .main_settings ["use_times" ]:
458+ recording = self .analyzer .recording
459+ ind1 , ind2 = recording .time_to_sample_index ([t1 , t2 ], segment_index = segment_index )
460+ else :
461+ t_start = 0.0
462+ sr = self .sampling_frequency
463+ ind1 = int ((t1 - t_start ) * sr )
464+ ind2 = int ((t2 - t_start ) * sr )
465+
466+ ind1 = max (0 , ind1 )
467+ ind2 = min (self .get_num_samples (segment_index ), ind2 )
468+ return ind1 , ind2
469+
446470 def sample_index_to_time (self , sample_index ):
447471 segment_index = self .time_info ["segment_index" ]
448472 if self .main_settings ["use_times" ] and self .analyzer .has_recording ():
@@ -610,14 +634,33 @@ def get_traces(self, trace_source='preprocessed', **kargs):
610634 cache_key = (kargs .get ("segment_index" , None ), kargs .get ("start_frame" , None ), kargs .get ("end_frame" , None ))
611635 if cache_key in self ._traces_cached :
612636 return self ._traces_cached [cache_key ]
637+ else :
638+ # check if start_frame and end_frame are a subset interval of a cached one
639+ for cached_key in self ._traces_cached .keys ():
640+ cached_seg = cached_key [0 ]
641+ cached_start = cached_key [1 ]
642+ cached_end = cached_key [2 ]
643+ req_seg = kargs .get ("segment_index" , None )
644+ req_start = kargs .get ("start_frame" , None )
645+ req_end = kargs .get ("end_frame" , None )
646+ if cached_seg is not None and req_seg is not None :
647+ if cached_seg != req_seg :
648+ continue
649+ if cached_start is not None and cached_end is not None and req_start is not None and req_end is not None :
650+ if req_start >= cached_start and req_end <= cached_end :
651+ # subset found
652+ traces = self ._traces_cached [cached_key ]
653+ start_offset = req_start - cached_start
654+ end_offset = req_end - cached_start
655+ return traces [start_offset :end_offset , :]
613656
614657 if len (self ._traces_cached ) > 4 :
615658 self ._traces_cached .pop (list (self ._traces_cached .keys ())[0 ])
616659
617660 if trace_source == 'preprocessed' :
618661 rec = self .analyzer .recording
619662 elif trace_source == 'raw' :
620- raise NotImplemented
663+ raise NotImplementedError ( "Raw traces not implemented yet" )
621664 # TODO get with parent recording the non process recording
622665 kargs ['return_in_uV' ] = self .return_in_uV
623666 traces = rec .get_traces (** kargs )
0 commit comments