Snakefile 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609
  1. import config
  2. import numpy as np
  3. from pathlib import Path
  4. wildcard_constraints:
  5. source_pop = 'E|I',
  6. target_pop = 'E|I',
  7. fraction = '[\d\.]+',
  8. f = '[\d\.]+',
  9. N = '\d+',
  10. epsilon = '[\d\.]+',
  11. eta = '[\d\.]+',
  12. mu = '[\d\.]+',
  13. seed = '\d+',
  14. seed_a = '\d+',
  15. seed_b = '\d+',
  16. sigma_ex = '[\d\.]+',
  17. sigma_in = '[\d\.]+',
  18. plot = '[\w\d\-]+',
  19. matrix = 'weights|correlations',
  20. measures = 'weights|correlations|ratecorr',
  21. protocol = '[\w\d\-\.]+',
  22. syndist = '[a-z\-]+',
  23. network_specs = '[\w\d\.]+',
  24. size = '[\d\.]+',
  25. length = '\d',
  26. connectors = '\d+',
  27. connectors_a = '\d+',
  28. connectors_b = '\d+',
  29. rule rewire_and_redraw:
  30. input:
  31. expand('simulation_output/'\
  32. + 'N{N}_f{f}_mu{mu}_p{epsilon}_eta{eta}_sex{sigma_ex}_'\
  33. + 'sin{sigma_in}_{syndist}/seed_{seed}/{protocol}/{outfile}', #'{plot}.pdf',
  34. N = config.N,
  35. f = config.f,
  36. mu = config.mu,
  37. epsilon = config.epsilon,
  38. eta = config.eta,
  39. sigma_ex = config.sigma_ex,
  40. sigma_in = config.sigma_in,
  41. syndist = config.syndist,
  42. seed = config.seed,
  43. outfile = 'correlations.npy',
  44. # plot = ['correlations', 'weights',
  45. # 'spikes_50000-60000ms', 'spikes_59000-60000ms'],
  46. protocol = ['original']
  47. + expand('shuffle_{frac}_{source}-{target}',
  48. frac=config.shuffle_frac,
  49. source=config.shuffle_source,
  50. target=config.shuffle_target)
  51. + expand('add_{source_frac}{source}-{target_frac}{target}',
  52. source_frac=config.add_source_frac,
  53. target_frac=config.add_target_frac,
  54. source=config.add_source,
  55. target=config.add_target)
  56. + expand('cluster_{num}x{size}{target}_p{epsilon}',
  57. num=config.cluster_number,
  58. size=config.cluster_size,
  59. target=config.cluster_pop,
  60. epsilon=config.cluster_epsilon))
  61. rule redraw_comparisons:
  62. input:
  63. expand('results/N{N}_f{f}_mu{mu}_p{epsilon}_eta{eta}_sex{sigma_ex}_'\
  64. + 'sin{sigma_in}_{syndist}/redraw_{protocol}/{measure}_{seed_pair}.csv',
  65. N = config.N,
  66. f = config.f,
  67. mu = config.mu,
  68. epsilon = config.epsilon,
  69. eta = config.eta,
  70. sigma_ex = config.sigma_ex,
  71. sigma_in = config.sigma_in,
  72. syndist = config.syndist,
  73. seed_pair = config.seed_pairs[::int(len(config.seed)/2)],
  74. measure = ['correlations', 'weights', 'ratecorr'],
  75. protocol =
  76. ['original']
  77. # + expand('cluster_{num}x{size}{target}_p{epsilon}',
  78. # num=config.cluster_number,
  79. # size=config.cluster_size,
  80. # target=config.cluster_pop,
  81. # epsilon=config.cluster_epsilon)
  82. # + expand('chain_{num}x{size}{target}_j{strength}_p{epsilon}',
  83. # num=config.chain_length,
  84. # size=config.chain_size,
  85. # target=config.chain_pop,
  86. # strength=config.chain_strength,
  87. # epsilon=config.chain_epsilon)
  88. )
  89. rule rewire_comparisons:
  90. input:
  91. expand('results/N{N}_f{f}_mu{mu}_p{epsilon}_eta{eta}_sex{sigma_ex}_'\
  92. + 'sin{sigma_in}_{syndist}/{protocol}/{measure}_{seed}.csv',
  93. N = config.N,
  94. f = config.f,
  95. mu = config.mu,
  96. epsilon = config.epsilon,
  97. eta = config.eta,
  98. sigma_ex = config.sigma_ex,
  99. sigma_in = config.sigma_in,
  100. syndist = config.syndist,
  101. seed = config.seed,
  102. measure = ['correlations', 'weights', 'ratecorr'],
  103. protocol =
  104. # expand('sheffle_{frac}_{source}-{target}',
  105. # frac=3500, #config.shuffle_frac,
  106. # source=config.shuffle_source,
  107. # target=config.shuffle_target)
  108. # +
  109. expand('add_{source_frac}{source}-{target_frac}{target}',
  110. source_frac=config.add_source_frac,
  111. target_frac=config.add_target_frac,
  112. source=config.add_source,
  113. target=config.add_target)
  114. # + expand('cluster_{num}x{size}{target}_p{epsilon}',
  115. # num=config.cluster_number,
  116. # size=config.cluster_size,
  117. # target=config.cluster_pop,
  118. # epsilon=config.cluster_epsilon)
  119. # expand('chain_{length}_{size}{cpop}_j{strength}_p{epsilon}_c{c_a}-{c_b}',
  120. # length=config.chain_length,
  121. # c_a=config.connectors[0],
  122. # c_b=config.connectors[1],
  123. # size=config.chain_size,
  124. # cpop=config.chain_pop,
  125. # strength=config.chain_strength,
  126. # epsilon=config.chain_epsilon)
  127. )
  128. # rule chain_comparisons:
  129. # input:
  130. # expand('results/N{N}_f{f}_mu{mu}_p{epsilon}_eta{eta}_sex{sigma_ex}_'\
  131. # + 'sin{sigma_in}_{syndist}/{protocol}/{measure}_{seed}.csv',
  132. # N = config.N,
  133. # f = config.f,
  134. # mu = config.mu,
  135. # epsilon = config.epsilon,
  136. # eta = config.eta,
  137. # sigma_ex = config.sigma_ex,
  138. # sigma_in = config.sigma_in,
  139. # syndist = config.syndist,
  140. # seed = config.seed,
  141. # measure = ['correlations', 'weights', 'ratecorr'],
  142. # protocol = expand('shuffle_{frac}_{source}-{target}',
  143. # frac=config.shuffle_frac,
  144. # source=config.shuffle_source,
  145. # target=config.shuffle_target)
  146. # )
  147. # REWIRE EXPERIMENTS
  148. def id_span(N, f, pop):
  149. N, f = int(N), float(f)
  150. N_exc = int(N*f)
  151. if pop == 'E':
  152. return (0, N_exc)
  153. elif pop =='I':
  154. return (N_exc, N)
  155. else:
  156. raise ValueError
  157. rule shuffle_weights:
  158. input:
  159. script = 'scripts/shuffle_weights.py',
  160. weights = '{root}/N{N}_f{f}_{specs}/original/weights.npy'
  161. output:
  162. weights = '{root}/N{N}_f{f}_{specs}/'\
  163. + 'shuffle_{fraction}_{source_pop}-{target_pop}/weights.npy'
  164. params:
  165. source_span = lambda w: id_span(w.N, w.f, w.source_pop),
  166. target_span = lambda w: id_span(w.N, w.f, w.target_pop),
  167. shell:
  168. """
  169. python {input.script} --input "{input.weights}" \
  170. --output "{output.weights}" \
  171. --source_span {params.source_span} \
  172. --target_span {params.target_span} \
  173. --fraction {wildcards.fraction}
  174. """
  175. use rule shuffle_weights as sheffle_weights with:
  176. output:
  177. weights = '{root}/N{N}_f{f}_{specs}/'\
  178. + 'sheffle_{fraction}_{source_pop}-{target_pop}/weights.npy'
  179. rule add_weights:
  180. input:
  181. script = 'scripts/add_weights.py',
  182. weights = '{root}/N{N}_f{f}_{specs}/original/weights.npy'
  183. output:
  184. weights = '{root}/N{N}_f{f}_{specs}/'\
  185. + 'add_{source_frac}{source_pop}-{target_frac}{target_pop}'\
  186. + '/weights.npy'
  187. params:
  188. source_span = lambda w: id_span(w.N, w.f, w.source_pop),
  189. target_span = lambda w: id_span(w.N, w.f, w.target_pop),
  190. weight_mean = lambda w: config.J_ex if w.source_pop == 'E' else config.J_in,
  191. weight_std = lambda w: config.sigma_ex if w.source_pop == 'E' else config.sigma_in,
  192. syndist = config.syndist
  193. shell:
  194. """
  195. python {input.script} --input "{input.weights}" \
  196. --output "{output}" \
  197. --source_span {params.source_span} \
  198. --target_span {params.target_span} \
  199. --source_fraction {wildcards.source_frac} \
  200. --target_fraction {wildcards.target_frac} \
  201. --weight_mean {params.weight_mean} \
  202. --weight_std {params.weight_std} \
  203. --syndist {params.syndist}
  204. """
  205. rule cluster_weights:
  206. input:
  207. script = 'scripts/cluster_weights.py',
  208. weights = '{root}/N{N}_f{f}_{specs}/original/weights.npy'
  209. output:
  210. weights = '{root}/N{N}_f{f}_{specs}/'\
  211. + 'cluster_{num}x{size}{cpop}_p{epsilon}/weights.npy'
  212. params:
  213. pop_span = lambda w: id_span(w.N, w.f, w.cpop),
  214. weight_mean = lambda w: config.J_ex if w.cpop == 'E' else config.J_in,
  215. weight_std = lambda w: config.sigma_ex if w.cpop == 'E' else config.sigma_in,
  216. syndist = config.syndist
  217. shell:
  218. """
  219. python {input.script} --input "{input.weights}" \
  220. --output "{output}" \
  221. --cluster_number {wildcards.num} \
  222. --cluster_fraction {wildcards.size} \
  223. --cluster_prob {wildcards.epsilon} \
  224. --pop_span {params.pop_span} \
  225. --weight_mean {params.weight_mean} \
  226. --weight_std {params.weight_std} \
  227. --syndist {params.syndist}
  228. """
  229. rule hub_weights:
  230. input:
  231. script = 'scripts/hub_weights.py',
  232. weights = '{root}/N{N}_f{f}_{specs}/original/weights.npy'
  233. output:
  234. weights = '{root}/N{N}_f{f}_{specs}/' \
  235. + 'hub_{size}{hpop}_j{strength}_p{epsilon}/weights.npy'
  236. params:
  237. pop_span = lambda w: id_span(w.N, w.f, w.hpop),
  238. shell:
  239. """
  240. python {input.script} --input "{input.weights}" \
  241. --output "{output.weights}" \
  242. --hub_size {wildcards.size} \
  243. --hub_prob {wildcards.epsilon} \
  244. --hub_strength {wildcards.strength} \
  245. --pop_span {params.pop_span}
  246. """
  247. def chain_sections(w):
  248. min_size = int(w.length)
  249. sections = list(range(min_size, int(w.length)+min_size))[::-1]
  250. norm = sum(sections)
  251. return [i/norm for i in sections]
  252. rule chain_weights:
  253. input:
  254. script = 'scripts/chain_weights.py',
  255. weights = '{root}/N{N}_f{f}_{network_specs}/seed_{seed}/original/weights.npy'
  256. output:
  257. weights = '{root}/N{N}_f{f}_{network_specs}/seed_{seed}/' \
  258. + 'chain_{length}_{size}{cpop}' \
  259. + '_j{strength}_p{epsilon}_c{connectors}/weights.npy'
  260. params:
  261. pop_span = lambda w: id_span(w.N, w.f, w.cpop),
  262. chain_sections = chain_sections
  263. shell:
  264. """
  265. python {input.script} --input "{input.weights}" \
  266. --output "{output.weights}" \
  267. --chain_size {wildcards.size} \
  268. --chain_prob {wildcards.epsilon} \
  269. --chain_strength {wildcards.strength} \
  270. --pop_span {params.pop_span} \
  271. --chain_sections "{params.chain_sections}" \
  272. --connectors {wildcards.connectors} \
  273. --seed {wildcards.seed}
  274. """
  275. # COMPARE NETWORK ACTIVITY AND CONNECTIVITY
  276. rule compare_redrawn_networks:
  277. input:
  278. script = "../scripts/eigenangle_test.py",
  279. matrix_a = 'simulation_output/'\
  280. + 'N{N}_f{f}_mu{mu}_p{epsilon}_eta{eta}_sex{sigma_ex}'\
  281. + '_sin{sigma_in}_{syndist}/seed_{seed_a}/{protocol}/{matrix}.npy',
  282. matrix_b = 'simulation_output/'\
  283. + 'N{N}_f{f}_mu{mu}_p{epsilon}_eta{eta}_sex{sigma_ex}'\
  284. + '_sin{sigma_in}_{syndist}/seed_{seed_b}/{protocol}/{matrix}.npy'
  285. output:
  286. temp('results/N{N}_f{f}_mu{mu}_p{epsilon}_eta{eta}_sex{sigma_ex}'\
  287. + '_sin{sigma_in}_{syndist}/redraw_{protocol}/'\
  288. + '{matrix}_{seed_a}-{seed_b}.json')
  289. params:
  290. bin_num = config.bin_num,
  291. is_connectivity = lambda w: True if ('weights' in w.matrix) else False,
  292. shuffle_neuron_ids = lambda w, output: 'redraw' in str(output)
  293. shell:
  294. """
  295. python {input.script} --matrix_a {input.matrix_a} \
  296. --matrix_b {input.matrix_b} \
  297. --output {output} \
  298. --N {wildcards.N} \
  299. --bin_num {params.bin_num} \
  300. --mu {wildcards.mu} \
  301. --f {wildcards.f} \
  302. --epsilon {wildcards.epsilon} \
  303. --sigma_ex {wildcards.sigma_ex} \
  304. --sigma_in {wildcards.sigma_in} \
  305. --is_connectivity {params.is_connectivity} \
  306. --shuffle_neuron_ids {params.shuffle_neuron_ids}
  307. """
  308. use rule compare_redrawn_networks as compare_rewired_network with:
  309. input:
  310. script = "../scripts/eigenangle_test.py",
  311. matrix_a = 'simulation_output/'\
  312. + 'N{N}_f{f}_mu{mu}_p{epsilon}_eta{eta}_sex{sigma_ex}'\
  313. + '_sin{sigma_in}_{syndist}/seed_{seed}/original/{matrix}.npy',
  314. matrix_b = 'simulation_output/'\
  315. + 'N{N}_f{f}_mu{mu}_p{epsilon}_eta{eta}_sex{sigma_ex}'\
  316. + '_sin{sigma_in}_{syndist}/seed_{seed}/{protocol}/{matrix}.npy',
  317. output:
  318. temp('results/N{N}_f{f}_mu{mu}_p{epsilon}_eta{eta}_sex{sigma_ex}'\
  319. + '_sin{sigma_in}_{syndist}/{protocol}/{matrix}_{seed}.json')
  320. use rule compare_redrawn_networks as compare_chain_networks with:
  321. input:
  322. script = "../scripts/eigenangle_test.py",
  323. matrix_a = 'simulation_output/'\
  324. + 'N{N}_f{f}_mu{mu}_p{epsilon}_eta{eta}_sex{sigma_ex}'\
  325. + '_sin{sigma_in}_{syndist}/seed_{seed}/chain_{specs}_'\
  326. + 'c{connectors_a}/{matrix}.npy',
  327. matrix_b = 'simulation_output/'\
  328. + 'N{N}_f{f}_mu{mu}_p{epsilon}_eta{eta}_sex{sigma_ex}'\
  329. + '_sin{sigma_in}_{syndist}/seed_{seed}/chain_{specs}_'\
  330. + 'c{connectors_b}/{matrix}.npy',
  331. output:
  332. 'results/N{N}_f{f}_mu{mu}_p{epsilon}_eta{eta}_sex{sigma_ex}'\
  333. + '_sin{sigma_in}_{syndist}/chain_{specs}_'\
  334. + 'c{connectors_a}-{connectors_b}/{matrix}_{seed}.json'
  335. #
  336. # ruleorder: calc_firing_rate_correlation > score_to_dataframe #> compare_chain_networks > compare_rewired_network
  337. def get_spikes(wildcards):
  338. network_specs = wildcards.network_specs
  339. protocol = wildcards.protocol
  340. seeds = wildcards.seeds
  341. path = lambda prcl, s: f'simulation_output/{network_specs}/' \
  342. + f'seed_{s}/{prcl}/spikes.pkl'
  343. if 'redraw' in protocol:
  344. protocol = protocol.strip('redraw_')
  345. return [path(protocol, seed) for seed in seeds.split('-')]
  346. elif 'chain' in protocol:
  347. protocol, connectors = protocol.split('_c')
  348. connectors = connectors.split('-')
  349. return [path(f'{protocol}_c{c}', seeds) for c in connectors]
  350. else:
  351. return [path(p, seeds) for p in ['original', protocol]]
  352. rule calc_firing_rate_correlation:
  353. input:
  354. script = 'scripts/firing_rate_correlation.py',
  355. spikes = get_spikes
  356. params:
  357. sim_folder = 'simulation_output'
  358. output:
  359. 'results/{network_specs}/{protocol}/ratecorr_{seeds}.csv'
  360. shell:
  361. """
  362. python {input.script} --output "{output}" \
  363. --input "{input.spikes}" \
  364. --protocol {wildcards.protocol} \
  365. --seeds {wildcards.seeds}
  366. """
  367. # BUILD AND SIMULATE NETWORK
  368. rule build_network:
  369. input:
  370. script = 'scripts/build_network.py',
  371. config = 'config.py'
  372. params:
  373. out_config = lambda w, output: Path(output.weights).parents[1] / 'config.yml'
  374. output:
  375. weights = 'simulation_output/'\
  376. + 'N{N}_f{f}_mu{mu}_p{epsilon}_eta{eta}_sex{sigma_ex}_'\
  377. + 'sin{sigma_in}_{syndist}/seed_{seed}/original/weights.npy'
  378. shell:
  379. """
  380. python {input.script} --weights_path {output.weights} \
  381. --out_config {params.out_config} \
  382. --network_config {input.config} \
  383. --N {wildcards.N} \
  384. --f {wildcards.f} \
  385. --mu {wildcards.mu} \
  386. --sigma_ex {wildcards.sigma_ex} \
  387. --sigma_in {wildcards.sigma_in} \
  388. --epsilon {wildcards.epsilon} \
  389. --seed {wildcards.seed} \
  390. --syndist {wildcards.syndist}
  391. """
  392. rule simulate_network:
  393. input:
  394. script = 'scripts/simulate_network.py',
  395. weights = 'simulation_output/'\
  396. + 'N{N}_f{f}_mu{mu}_p{epsilon}_eta{eta}_sex{sigma_ex}_'\
  397. + 'sin{sigma_in}_{syndist}/seed_{seed}/{protocol}/weights.npy',
  398. output:
  399. spikes_ex = temp('simulation_output/'\
  400. + 'N{N}_f{f}_mu{mu}_p{epsilon}_eta{eta}_sex{sigma_ex}_'\
  401. + 'sin{sigma_in}_{syndist}/seed_{seed}/{protocol}/spikes_ex.gdf'),
  402. spikes_in = temp('simulation_output/'\
  403. + 'N{N}_f{f}_mu{mu}_p{epsilon}_eta{eta}_sex{sigma_ex}_'\
  404. + 'sin{sigma_in}_{syndist}/seed_{seed}/{protocol}/spikes_in.gdf'),
  405. params:
  406. simtime = config.simtime,
  407. config_path = 'config.py'
  408. shell:
  409. """
  410. python {input.script} --spikes_ex_path {output.spikes_ex} \
  411. --spikes_in_path {output.spikes_in} \
  412. --weights_path {input.weights} \
  413. --network_config {params.config_path} \
  414. --N {wildcards.N} \
  415. --f {wildcards.f} \
  416. --mu {wildcards.mu} \
  417. --sigma_ex {wildcards.sigma_ex} \
  418. --sigma_in {wildcards.sigma_in} \
  419. --epsilon {wildcards.epsilon} \
  420. --simtime {params.simtime} \
  421. --seed {wildcards.seed} \
  422. --eta {wildcards.eta}
  423. """
  424. # TRANSFORM RULES
  425. rule nest_to_neo:
  426. input:
  427. script = 'scripts/nest_to_neo.py',
  428. spikes_ex = 'simulation_output/N{N}_f{f}_{specs}/spikes_ex.gdf',
  429. spikes_in = 'simulation_output/N{N}_f{f}_{specs}/spikes_in.gdf',
  430. output:
  431. 'simulation_output/N{N}_f{f}_{specs}/spikes.pkl'
  432. params:
  433. t_start = 0,
  434. t_stop = config.simtime
  435. shell:
  436. """
  437. python {input.script} --spikes_ex "{input.spikes_ex}" \
  438. --spikes_in "{input.spikes_in}" \
  439. --output {output} \
  440. --t_stop {params.t_stop} \
  441. --t_start {params.t_start} \
  442. --N {wildcards.N} \
  443. --f {wildcards.f}
  444. """
  445. rule create_correlation_matrix_from_spikes:
  446. input:
  447. script = 'scripts/correlation_matrix_from_spikes.py',
  448. spikes = '{spikes_dir}/spikes.pkl',
  449. output:
  450. correlation = '{spikes_dir}/correlations.npy'
  451. params:
  452. t_start = config.cut_inital_time,
  453. t_stop = config.simtime,
  454. bin_size = config.bin_size
  455. shell:
  456. """
  457. python {input.script} --spikes "{input.spikes}" \
  458. --output {output} \
  459. --t_stop {params.t_stop} \
  460. --t_start {params.t_start} \
  461. --bin_size {params.bin_size}
  462. """
  463. rule score_to_dataframe:
  464. input:
  465. script = '../scripts/score_to_dataframe.py',
  466. data = 'results/N{N}_f{f}_mu{mu}_p{epsilon}_eta{eta}_sex{sigma_ex}' \
  467. + '_sin{sigma_in}_{syndist}/{protocol}/{matrix}_{seeds}.json'
  468. output:
  469. 'results/N{N}_f{f}_mu{mu}_p{epsilon}_eta{eta}_sex{sigma_ex}' \
  470. + '_sin{sigma_in}_{syndist}/{protocol}/{matrix}_{seeds}.csv'
  471. params:
  472. bin_num = config.bin_num,
  473. simtime = config.simtime
  474. shell:
  475. """
  476. python {input.script} --output "{output}" \
  477. --input "{input.data}" \
  478. --params {wildcards} \
  479. --bin_num {params.bin_num} \
  480. --simtime {params.simtime}
  481. """
  482. rule merge_comparison_results:
  483. input:
  484. script = '../scripts/merge_dataframes.py',
  485. params:
  486. exclude = ['merged_ratecorr_results', 'merged_comparison_results',
  487. 'rewiring_results', 'ratecorr']
  488. output:
  489. temp('{dir}/merged_comparison_results.csv')
  490. shell:
  491. """
  492. python {input.script} --output "{output}" \
  493. --exclude "{params.exclude}"
  494. """
  495. use rule merge_comparison_results as merge_ratecorr_results with:
  496. params:
  497. exclude = ['merged_ratecorr_results', 'merged_comparison_results',
  498. 'rewiring_results', 'weights', 'correlations']
  499. output:
  500. temp('{dir}/merged_ratecorr_results.csv')
  501. rule process_result_dataframe:
  502. input:
  503. script = 'scripts/process_result_dataframe.py',
  504. comparison_df = '{dir}/merged_comparison_results.csv',
  505. ratecorr_df = '{dir}/merged_ratecorr_results.csv'
  506. output:
  507. '{dir}/rewiring_results.csv'
  508. shell:
  509. """
  510. python {input.script} --output "{output}" \
  511. --comparison_df "{input.comparison_df}" \
  512. --ratecorr_df "{input.ratecorr_df}"
  513. """
  514. # PLOT SIMULATION OUTPUT
  515. rule plot_spiketrains:
  516. input:
  517. script = '../scripts/plot_spiketrains.py',
  518. spikes = 'simulation_output/{network_specs}/seed_{seed}/{protocol}/spikes.pkl'
  519. output:
  520. 'images/rasterplot/{network_specs}_seed{seed}_{protocol}_spikes{t_start}-{t_stop}ms.pdf'
  521. shell:
  522. """
  523. python {input.script} --spikes "{input.spikes}" \
  524. --output "{output}" \
  525. --t_start {wildcards.t_start} \
  526. --t_stop {wildcards.t_stop}
  527. """
  528. rule plot_matrix:
  529. input:
  530. script = '../scripts/plot_matrix.py',
  531. matrix = 'simulation_output/{network_specs}/seed_{seed}/{protocol}/{matrix}.npy'
  532. output:
  533. 'images/{matrix}/{network_specs}_seed{seed}_{protocol}.pdf'
  534. shell:
  535. """
  536. python {input.script} --input "{input.matrix}" \
  537. --output "{output}"
  538. """
  539. rule plot_eigenspectrum:
  540. input:
  541. script = 'scripts/plot_eigenspectrum.py',
  542. files = expand('simulation_output/N{{N}}_f{{f}}_mu{{mu}}_p{{epsilon}}' \
  543. + '_eta{{eta}}_sex{{sigma_ex}}_sin{{sigma_in}}_{{syndist}}' \
  544. + '/seed_{seed}/{{protocol}}/weights.npy',
  545. seed = range(1,9))
  546. output:
  547. 'images/eigenspectrum/N{N}_f{f}_mu{mu}_p{epsilon}_eta{eta}' \
  548. + '_sex{sigma_ex}_sin{sigma_in}_{syndist}_{protocol}.pdf'
  549. shell:
  550. """
  551. python {input.script} --input "{input.files}" \
  552. --output "{output}" \
  553. --N {wildcards.N} \
  554. --f {wildcards.f} \
  555. --mu {wildcards.mu} \
  556. --sigma_ex {wildcards.sigma_ex} \
  557. --sigma_in {wildcards.sigma_in} \
  558. --epsilon {wildcards.epsilon} \
  559. """
  560. rule plot_pvalues:
  561. input:
  562. script = 'scripts/plot_pvalue_{plot_name}.py',
  563. dataframe = 'results/{network_specs}/rewiring_results.csv'
  564. output:
  565. 'images/pvalue_{plot_name}/{network_specs}-{protocol}.pdf'
  566. shell:
  567. """
  568. python {input.script} --input "{input.dataframe}" \
  569. --output "{output}" \
  570. --protocol {wildcards.protocol}
  571. """