analyse_persistent_activity.py 3.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import numpy
  2. import pandas as pd
  3. from tools.helper import get_filters
  4. from tools.definitions import OUTPUT_FOLDER, HELPER_TABLE_FOLDER, STIMULATION_METADATA_FILTERED
  5. print "# Analyse persistent activity"
  6. print "Test whether in the UP protocols frequency was increased/in DOWN protocols frequency was decreased"
  7. pulse_mean_string = "p_{:d}_ISI_mean"
  8. after_pulse_mean_string = "ap_{:d}_ISI_mean"
  9. path_to_filtered_stimulus_file = OUTPUT_FOLDER+HELPER_TABLE_FOLDER+STIMULATION_METADATA_FILTERED
  10. stimulations = pd.read_csv(path_to_filtered_stimulus_file, index_col="stimulation_id")
  11. stimulations["was_successful"] = numpy.nan
  12. # get protocols
  13. type_number_combinations = stimulations[["protocol_type", "pulse_number"]].drop_duplicates().values
  14. def analyse_up_protocols(stimulation):
  15. after_pulse_firing_columns = [after_pulse_mean_string.format(number) for number in
  16. range(1, stimulation["pulse_number"] + 1)]
  17. after_pulse_firing = stimulation[after_pulse_firing_columns].values.astype(numpy.float)
  18. after_pulse_firing = map(lambda firing: numpy.Infinity if numpy.isnan(firing) else firing, after_pulse_firing)
  19. isi_decreases = numpy.greater_equal(after_pulse_firing[:-1], after_pulse_firing[1:])
  20. isi_is_decreasing = numpy.all(isi_decreases)
  21. isi_is_finite_after_the_last_pulse = after_pulse_firing[-1] <= 10
  22. return isi_is_decreasing and isi_is_finite_after_the_last_pulse
  23. def analyse_down_protocols(stimulation):
  24. during_pulse_firing_columns = [pulse_mean_string.format(number) for number in
  25. range(1, stimulation["pulse_number"] + 1)]
  26. during_pulse_firing = stimulation[during_pulse_firing_columns].values.astype(numpy.float)
  27. during_pulse_firing = map(lambda isi: numpy.Infinity if numpy.isnan(isi) else isi,
  28. during_pulse_firing)
  29. after_protocol_firing = stimulation["isi_after"]
  30. firing = list(during_pulse_firing) + [after_protocol_firing]
  31. isi_is_increasing = True
  32. for isi_pre, isi_after in zip(firing[:-1], firing[1:]):
  33. isi_pre = numpy.Infinity if numpy.isnan(isi_pre) else isi_pre
  34. isi_after = numpy.Infinity if numpy.isnan(isi_after) else isi_after
  35. isi_increases = (isi_pre < isi_after) or (isi_pre == numpy.Infinity and isi_pre == numpy.Infinity)
  36. isi_is_increasing = isi_is_increasing and isi_increases
  37. return isi_is_increasing
  38. for type_number in type_number_combinations:
  39. protocol_type = type_number[0]
  40. number = type_number[1]
  41. # Determine the protocol
  42. protocol_id = "{}-{:d}".format(protocol_type, number)
  43. path_to_firing_rates_file = OUTPUT_FOLDER+HELPER_TABLE_FOLDER+"{}.csv".format(protocol_id)
  44. firing_rates = pd.read_csv(path_to_firing_rates_file, index_col="stimulation_id")
  45. if protocol_type == "UP":
  46. firing_rates["was_successful"] = firing_rates.apply(analyse_up_protocols,
  47. axis=1)
  48. elif protocol_type == "DOWN":
  49. firing_rates["was_successful"] = firing_rates.apply(analyse_down_protocols,
  50. axis=1)
  51. else:
  52. RuntimeWarning("Unknown protocol {}".format(protocol_type))
  53. stimulations.loc[(stimulations["protocol_type"] == protocol_type) & (stimulations["pulse_number"] == number) & (
  54. get_filters(stimulations)),
  55. "was_successful"] = firing_rates["was_successful"].values
  56. stimulations.to_csv(path_or_buf=path_to_filtered_stimulus_file)