Snakefile 26 KB

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