@@ -374,57 +374,80 @@ def compute_objectives(local_features, operational_config, opt_targets):
374374 all_features_dict = {}
375375 constraints = []
376376
377+ active_threshold = 0.01
377378 target_populations = operational_config ["target_populations" ]
379+ temporal_resolution = operational_config ["temporal_resolution" ]
378380 for pop_name in target_populations :
379381 pop_features_dicts = [
380382 features_dict [0 ][pop_name ] for features_dict in local_features
381383 ]
382384
383385 sum_mean_rate = 0.0
384- sum_snr = 0.0
385386 n_total = 0
386387 n_active = 0
387- n_target_rate_map = 0
388+ time_bins_ref = None
389+ sum_active_per_bin = None
388390 for pop_feature_dict in pop_features_dicts :
389391 n_active_local = pop_feature_dict ["n_active" ]
390392 n_total_local = pop_feature_dict ["n_total" ]
391- n_target_rate_map_local = pop_feature_dict ["n_target_rate_map" ]
392- sum_mean_rate_local = pop_feature_dict ["sum_mean_rate" ]
393- sum_snr_local = pop_feature_dict ["sum_snr" ]
393+ time_bins = pop_feature_dict ["time_bins" ]
394+ if time_bins_ref is None :
395+ time_bins_ref = time_bins
396+ spike_density_dict = pop_feature_dict ["spike_density_dict" ]
397+ sum_mean_rate_local = 0.0
398+ t_start = time_bins_ref [0 ]
399+ t_end = time_bins_ref [- 1 ] + (time_bins_ref [1 ] - time_bins_ref [0 ])
400+ # time bins for fraction active per time bin calculation
401+ fr_time_bins = np .arange (t_start , t_end , temporal_resolution )
402+ bin_width = time_bins_ref [1 ] - time_bins_ref [0 ]
403+ time_centers = time_bins_ref + bin_width / 2
404+ fr_time_centers = fr_time_bins + temporal_resolution / 2
405+ if sum_active_per_bin is None :
406+ sum_active_per_bin = np .zeros_like (time_centers )
407+ for gid , dens_dict in spike_density_dict .items ():
408+ mean_rate = np .mean (dens_dict ["rate" ])
409+ if mean_rate > 0.0 :
410+ sum_mean_rate_local += mean_rate
411+ ip_rate = np .interp1d (
412+ fr_time_centers ,
413+ dens_dict ["rate" ],
414+ kind = "linear" ,
415+ bounds_error = False ,
416+ fill_value = 0.0 ,
417+ )
418+ active_per_bin = ip_rate > active_threshold
419+ sum_active_per_bin += active_per_bin
394420
395421 n_total += n_total_local
396422 n_active += n_active_local
397- n_target_rate_map += n_target_rate_map_local
398423 sum_mean_rate += sum_mean_rate_local
399424
400- if sum_snr_local is not None :
401- sum_snr += sum_snr_local
402-
403425 if n_active > 0 :
404426 mean_rate = sum_mean_rate / n_active
405427 else :
406428 mean_rate = 0.0
407429
408430 if n_total > 0 :
409431 fraction_active = n_active / n_total
432+ mean_fraction_active_per_bin = np .mean (sum_active_per_bin / float (n_total ))
433+ std_fraction_active_per_bin = np .std (sum_active_per_bin / float (n_total ))
410434 else :
411435 fraction_active = 0.0
412-
413- mean_snr = None
414- if n_target_rate_map > 0 :
415- mean_snr = sum_snr / n_target_rate_map
436+ mean_fraction_active_per_bin = 0.0
437+ std_fraction_active_per_bin = 0.0
416438
417439 logger .info (
418440 f"population { pop_name } : n_active = { n_active } n_total = { n_total } mean rate = { mean_rate } "
419441 )
420- logger .info (
421- f"population { pop_name } : n_target_rate_map = { n_target_rate_map } snr: sum = { sum_snr } mean = { mean_snr } "
422- )
423442
443+ all_features_dict [f"{ pop_name } mean fraction active per time bin" ] = (
444+ mean_fraction_active_per_bin
445+ )
446+ all_features_dict [f"{ pop_name } std fraction active per time bin" ] = (
447+ std_fraction_active_per_bin
448+ )
424449 all_features_dict [f"{ pop_name } fraction active" ] = fraction_active
425450 all_features_dict [f"{ pop_name } firing rate" ] = mean_rate
426- if mean_snr is not None :
427- all_features_dict [f"{ pop_name } snr" ] = mean_snr
428451
429452 rate_constr = mean_rate if mean_rate > 0.0 else - 1.0
430453 constraints .append (rate_constr )
0 commit comments