pyNIBS 0.2024.8__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (107) hide show
  1. pyNIBS-0.2024.8.dist-info/LICENSE +623 -0
  2. pyNIBS-0.2024.8.dist-info/METADATA +723 -0
  3. pyNIBS-0.2024.8.dist-info/RECORD +107 -0
  4. pyNIBS-0.2024.8.dist-info/WHEEL +5 -0
  5. pyNIBS-0.2024.8.dist-info/top_level.txt +1 -0
  6. pynibs/__init__.py +34 -0
  7. pynibs/coil.py +1367 -0
  8. pynibs/congruence/__init__.py +15 -0
  9. pynibs/congruence/congruence.py +1108 -0
  10. pynibs/congruence/ext_metrics.py +257 -0
  11. pynibs/congruence/stimulation_threshold.py +318 -0
  12. pynibs/data/configuration_exp0.yaml +59 -0
  13. pynibs/data/configuration_linear_MEP.yaml +61 -0
  14. pynibs/data/configuration_linear_RT.yaml +61 -0
  15. pynibs/data/configuration_sigmoid4.yaml +68 -0
  16. pynibs/data/network mapping configuration/configuration guide.md +238 -0
  17. pynibs/data/network mapping configuration/configuration_TEMPLATE.yaml +42 -0
  18. pynibs/data/network mapping configuration/configuration_for_testing.yaml +43 -0
  19. pynibs/data/network mapping configuration/configuration_modelTMS.yaml +43 -0
  20. pynibs/data/network mapping configuration/configuration_reg_isi_05.yaml +43 -0
  21. pynibs/data/network mapping configuration/output_documentation.md +185 -0
  22. pynibs/data/network mapping configuration/recommendations_for_accuracy_threshold.md +77 -0
  23. pynibs/data/neuron/models/L23_PC_cADpyr_biphasic_v1.csv +1281 -0
  24. pynibs/data/neuron/models/L23_PC_cADpyr_monophasic_v1.csv +1281 -0
  25. pynibs/data/neuron/models/L4_LBC_biphasic_v1.csv +1281 -0
  26. pynibs/data/neuron/models/L4_LBC_monophasic_v1.csv +1281 -0
  27. pynibs/data/neuron/models/L4_NBC_biphasic_v1.csv +1281 -0
  28. pynibs/data/neuron/models/L4_NBC_monophasic_v1.csv +1281 -0
  29. pynibs/data/neuron/models/L4_SBC_biphasic_v1.csv +1281 -0
  30. pynibs/data/neuron/models/L4_SBC_monophasic_v1.csv +1281 -0
  31. pynibs/data/neuron/models/L5_TTPC2_cADpyr_biphasic_v1.csv +1281 -0
  32. pynibs/data/neuron/models/L5_TTPC2_cADpyr_monophasic_v1.csv +1281 -0
  33. pynibs/expio/Mep.py +1518 -0
  34. pynibs/expio/__init__.py +8 -0
  35. pynibs/expio/brainsight.py +979 -0
  36. pynibs/expio/brainvis.py +71 -0
  37. pynibs/expio/cobot.py +239 -0
  38. pynibs/expio/exp.py +1876 -0
  39. pynibs/expio/fit_funs.py +287 -0
  40. pynibs/expio/localite.py +1987 -0
  41. pynibs/expio/signal_ced.py +51 -0
  42. pynibs/expio/visor.py +624 -0
  43. pynibs/freesurfer.py +502 -0
  44. pynibs/hdf5_io/__init__.py +10 -0
  45. pynibs/hdf5_io/hdf5_io.py +1857 -0
  46. pynibs/hdf5_io/xdmf.py +1542 -0
  47. pynibs/mesh/__init__.py +3 -0
  48. pynibs/mesh/mesh_struct.py +1394 -0
  49. pynibs/mesh/transformations.py +866 -0
  50. pynibs/mesh/utils.py +1103 -0
  51. pynibs/models/_TMS.py +211 -0
  52. pynibs/models/__init__.py +0 -0
  53. pynibs/muap.py +392 -0
  54. pynibs/neuron/__init__.py +2 -0
  55. pynibs/neuron/neuron_regression.py +284 -0
  56. pynibs/neuron/util.py +58 -0
  57. pynibs/optimization/__init__.py +5 -0
  58. pynibs/optimization/multichannel.py +278 -0
  59. pynibs/optimization/opt_mep.py +152 -0
  60. pynibs/optimization/optimization.py +1445 -0
  61. pynibs/optimization/workhorses.py +698 -0
  62. pynibs/pckg/__init__.py +0 -0
  63. pynibs/pckg/biosig/biosig4c++-1.9.5.src_fixed.tar.gz +0 -0
  64. pynibs/pckg/libeep/__init__.py +0 -0
  65. pynibs/pckg/libeep/pyeep.so +0 -0
  66. pynibs/regression/__init__.py +11 -0
  67. pynibs/regression/dual_node_detection.py +2375 -0
  68. pynibs/regression/regression.py +2984 -0
  69. pynibs/regression/score_types.py +0 -0
  70. pynibs/roi/__init__.py +2 -0
  71. pynibs/roi/roi.py +895 -0
  72. pynibs/roi/roi_structs.py +1233 -0
  73. pynibs/subject.py +1009 -0
  74. pynibs/tensor_scaling.py +144 -0
  75. pynibs/tests/data/InstrumentMarker20200225163611937.xml +19 -0
  76. pynibs/tests/data/TriggerMarkers_Coil0_20200225163443682.xml +14 -0
  77. pynibs/tests/data/TriggerMarkers_Coil1_20200225170337572.xml +6373 -0
  78. pynibs/tests/data/Xdmf.dtd +89 -0
  79. pynibs/tests/data/brainsight_niiImage_nifticoord.txt +145 -0
  80. pynibs/tests/data/brainsight_niiImage_nifticoord_largefile.txt +1434 -0
  81. pynibs/tests/data/brainsight_niiImage_niifticoord_mixedtargets.txt +47 -0
  82. pynibs/tests/data/create_subject_testsub.py +332 -0
  83. pynibs/tests/data/data.hdf5 +0 -0
  84. pynibs/tests/data/geo.hdf5 +0 -0
  85. pynibs/tests/test_coil.py +474 -0
  86. pynibs/tests/test_elements2nodes.py +100 -0
  87. pynibs/tests/test_hdf5_io/test_xdmf.py +61 -0
  88. pynibs/tests/test_mesh_transformations.py +123 -0
  89. pynibs/tests/test_mesh_utils.py +143 -0
  90. pynibs/tests/test_nnav_imports.py +101 -0
  91. pynibs/tests/test_quality_measures.py +117 -0
  92. pynibs/tests/test_regressdata.py +289 -0
  93. pynibs/tests/test_roi.py +17 -0
  94. pynibs/tests/test_rotations.py +86 -0
  95. pynibs/tests/test_subject.py +71 -0
  96. pynibs/tests/test_util.py +24 -0
  97. pynibs/tms_pulse.py +34 -0
  98. pynibs/util/__init__.py +4 -0
  99. pynibs/util/dosing.py +233 -0
  100. pynibs/util/quality_measures.py +562 -0
  101. pynibs/util/rotations.py +340 -0
  102. pynibs/util/simnibs.py +763 -0
  103. pynibs/util/util.py +727 -0
  104. pynibs/visualization/__init__.py +2 -0
  105. pynibs/visualization/para.py +4372 -0
  106. pynibs/visualization/plot_2D.py +137 -0
  107. pynibs/visualization/render_3D.py +347 -0
@@ -0,0 +1,47 @@
1
+ # Version: 12
2
+ # Coordinate system: NIfTI:Scanner
3
+ # Created by: Brainsight 2.4.9
4
+ # Units: millimetres, degrees, milliseconds, and microvolts
5
+ # Encoding: UTF-8
6
+ # Notes: Each column is delimited by a tab. Each value within a column is delimited by a semicolon.
7
+ # Target Name Loc. X Loc. Y Loc. Z m0n0 m0n1 m0n2 m1n0 m1n1 m1n2 m2n0 m2n1 m2n2
8
+ Grid 1 -30.8428 -5.3267 64.7916 0.6378 -0.7144 0.2877 0.4953 0.6666 0.5571 -0.5898 -0.2128 0.7790
9
+ Grid 2 -31.1844 -14.9263 63.9842 0.7363 -0.6115 0.2896 0.3934 0.7352 0.5521 -0.5505 -0.2926 0.7819
10
+ Grid 3 -30.7333 -24.8329 62.6843 0.8303 -0.4727 0.2951 0.2630 0.7993 0.5403 -0.4913 -0.3710 0.7880
11
+ Grid 4 -30.1749 -34.7806 60.9488 0.9044 -0.2782 0.3234 0.0730 0.8478 0.5253 -0.4203 -0.4515 0.7871
12
+ Grid 5 -29.4729 -44.6629 58.2659 0.9257 -0.1301 0.3552 -0.0774 0.8540 0.5145 -0.3703 -0.5038 0.7804
13
+ Grid 6 -39.0555 -5.2258 59.4733 0.5645 -0.7429 0.3598 0.4771 0.6494 0.5922 -0.6736 -0.1626 0.7210
14
+ Grid 7 -39.9336 -15.0727 59.2835 0.6394 -0.6779 0.3628 0.4046 0.6978 0.5910 -0.6538 -0.2311 0.7205
15
+ Grid 8 -39.6519 -24.8847 58.5993 0.7320 -0.5753 0.3649 0.3014 0.7538 0.5838 -0.6110 -0.3174 0.7252
16
+ Grid 9 -38.7227 -34.8693 56.5547 0.8163 -0.4331 0.3822 0.1573 0.8033 0.5744 -0.5559 -0.4088 0.7238
17
+ Grid 10 -37.2954 -44.3732 53.2071 0.8632 -0.2882 0.4145 0.0031 0.8240 0.5666 -0.5048 -0.4878 0.7122
18
+ Grid 11 -47.1255 -5.2334 53.2950 0.4881 -0.7510 0.4448 0.4363 0.6513 0.6209 -0.7560 -0.1090 0.6455
19
+ Grid 12 -47.0786 -14.9371 52.9875 0.5506 -0.7053 0.4465 0.3774 0.6874 0.6206 -0.7446 -0.1732 0.6447
20
+ Grid 13 -47.2444 -24.7992 51.8260 0.6180 -0.6410 0.4552 0.2969 0.7264 0.6198 -0.7280 -0.2479 0.6393
21
+ Grid 14 -46.3680 -34.6823 50.3981 0.7001 -0.5410 0.4661 0.1833 0.7670 0.6149 -0.6902 -0.3450 0.6361
22
+ Grid 15 -45.1875 -43.6119 48.0059 0.7603 -0.4267 0.4897 0.0512 0.7910 0.6097 -0.6475 -0.4385 0.6233
23
+ Sample 12 -58.9553 -33.2536 34.1801 -0.5251 0.3593 -0.7714 -0.0314 -0.9140 -0.4044 -0.8504 -0.1882 0.4913
24
+ Sample 13 -56.2248 -7.3385 42.9699 -0.6037 0.0452 -0.7959 -0.0186 -0.9989 -0.0427 -0.7970 -0.0110 0.6039
25
+ # Sample Name Session Name Index Assoc. Target Loc. X Loc. Y Loc. Z m0n0 m0n1 m0n2 m1n0 m1n1 m1n2 m2n0 m2n1 m2n2 Dist. to Target Target Error Angular Error Twist Error Stim. Power A Stim. Pulse Interval Stim. Power B Date Time Creation Cause Crosshairs Driver Offset Comment EMG Channels EMG Window Start EMG Window End
26
+ Sample 1 Session 1 1 Grid 1 -55.1479 6.1262 44.3384 -0.6211 -0.0364 -0.7829 -0.0146 -0.9982 0.0580 -0.7836 0.0475 0.6194 33.7674 33.0508 20.8341 -129.8152 (null) (null) (null) 2022-05-04 12:52:28.341 Button Mouse 0.0000 (null) (null) (null) (null)
27
+ Sample 2 Session 1 2 Grid 1 -63.6209 -23.8103 27.8907 -0.4278 0.3416 -0.8368 -0.0301 -0.9307 -0.3646 -0.9034 -0.1308 0.4085 52.7041 49.9026 28.4977 -151.7541 (null) (null) (null) 2022-05-04 12:52:31.431 Button Mouse 0.0000 (null) (null) (null) (null)
28
+ Sample 3 Session 1 3 Grid 1 -44.6242 30.0542 52.5229 -0.7433 -0.0531 -0.6669 -0.0132 -0.9955 0.0939 -0.6688 0.0786 0.7392 39.9031 39.7955 17.5155 -128.5574 (null) (null) (null) 2022-05-04 12:52:33.542 Button Mouse 0.0000 (null) (null) (null) (null)
29
+ Sample 4 Session 1 4 Grid 3 -35.2757 6.7944 61.7833 -0.8588 -0.0578 -0.5090 -0.0116 -0.9912 0.1321 -0.5121 0.1194 0.8506 31.9645 31.5162 28.6470 -142.9211 (null) (null) (null) 2022-05-04 12:52:40.717 Button Mouse 0.0000 (null) (null) (null) (null)
30
+ Sample 5 Session 1 5 Grid 3 -13.4808 18.3753 70.2118 -0.9549 -0.0136 -0.2965 -0.0134 -0.9960 0.0887 -0.2966 0.0886 0.9509 47.1302 46.7631 30.4431 -150.6771 (null) (null) (null) 2022-05-04 12:52:43.158 Button Mouse 0.0000 (null) (null) (null) (null)
31
+ Sample 6 Session 1 6 Grid 3 -18.4564 55.0287 62.4736 -0.9595 -0.0753 -0.2716 -0.0051 -0.9589 0.2838 -0.2818 0.2737 0.9196 80.7999 78.7226 40.3975 -143.2218 (null) (null) (null) 2022-05-04 12:52:54.934 Button Mouse 0.0000 (null) (null) (null) (null)
32
+ Sample 7 Session 1 7 Grid 3 -32.4728 23.8971 61.7426 -0.8603 -0.0216 -0.5093 -0.0143 -0.9977 0.0665 -0.5096 0.0644 0.8580 48.7701 48.6638 25.5026 -145.8697 (null) (null) (null) 2022-05-04 12:52:59.357 Button Mouse 0.0000 (null) (null) (null) (null)
33
+ Sample 8 Session 1 8 Grid 8 -23.0275 17.9829 66.6807 -0.9408 -0.0111 -0.3388 -0.0141 -0.9973 0.0717 -0.3387 0.0722 0.9381 46.6831 46.4095 30.1882 -145.5609 (null) (null) (null) 2022-05-04 12:53:20.086 Button Mouse 0.0000 (null) (null) (null) (null)
34
+ Sample 9 Session 1 9 Grid 8 -57.1984 -14.2254 41.3910 -0.5961 0.1265 -0.7929 -0.0223 -0.9897 -0.1411 -0.8026 -0.0664 0.5928 26.7886 26.6000 19.7113 -146.7670 (null) (null) (null) 2022-05-04 12:53:22.534 Button Mouse 0.0000 (null) (null) (null) (null)
35
+ Sample 10 Session 1 10 Grid 8 -50.2868 19.9919 49.0658 -0.7051 -0.0108 -0.7091 -0.0157 -0.9994 0.0309 -0.7090 0.0329 0.7045 47.0945 47.0383 20.9906 -139.3842 (null) (null) (null) 2022-05-04 12:53:24.742 Button Mouse 0.0000 (null) (null) (null) (null)
36
+ Sample 11 Session 1 11 Grid 11 -50.2218 -22.8565 49.3190 -0.7086 0.0993 -0.6985 -0.0215 -0.9926 -0.1193 -0.7052 -0.0695 0.7055 18.3294 18.3195 5.0398 -137.1064 (null) (null) (null) 2022-05-04 12:53:29.390 Button Mouse 0.0000 (null) (null) (null) (null)
37
+ Sample 12 Session 1 12 Grid 11 -58.9553 -33.2536 34.1801 -0.5251 0.3593 -0.7714 -0.0314 -0.9140 -0.4044 -0.8504 -0.1882 0.4913 35.9229 35.4280 11.3312 -151.1384 (null) (null) (null) 2022-05-04 12:53:32.127 Button Mouse 0.0000 (null) (null) (null) (null)
38
+ Sample 13 Session 1 13 Grid 11 -56.2248 -7.3385 42.9699 -0.6037 0.0452 -0.7959 -0.0186 -0.9989 -0.0427 -0.7970 -0.0110 0.6039 13.9224 13.8836 6.5408 -133.2619 (null) (null) (null) 2022-05-04 12:53:35.327 Button Mouse 0.0000 (null) (null) (null) (null)
39
+ Sample 14 Session 1 14 Sample 13 -46.7327 8.0539 53.1294 -0.7357 -0.0184 -0.6771 -0.0152 -0.9989 0.0436 -0.6771 0.0424 0.7346 20.7422 20.6734 10.6270 3.4988 (null) (null) (null) 2022-05-04 12:57:40.904 Button Mouse 0.0000 (null) (null) (null) (null)
40
+ Sample 15 Session 1 15 Sample 13 -64.2987 17.5635 28.9303 -0.4324 -0.0517 -0.9002 -0.0144 -0.9978 0.0642 -0.9016 0.0407 0.4307 29.7053 29.6203 11.9835 5.6368 (null) (null) (null) 2022-05-04 12:57:43.080 Button Mouse 0.0000 (null) (null) (null) (null)
41
+ Sample 16 Session 1 16 Sample 13 -53.5237 -38.0805 40.9321 -0.5999 0.3424 -0.7231 -0.0314 -0.9132 -0.4064 -0.7994 -0.2211 0.5586 30.9277 30.7292 12.3387 -17.8797 (null) (null) (null) 2022-05-04 12:57:45.816 Button Mouse 0.0000 (null) (null) (null) (null)
42
+ # Planned Landmark Name Loc. X Loc. Y Loc. Z
43
+ LPA -75.2492 14.8688 -53.8637
44
+ Nasion 8.8695 102.2740 -14.0720
45
+ RPA 83.5259 10.3013 -61.3207
46
+ # Session Name Loc. X Loc. Y Loc. Z m0n0 m0n1 m0n2 m1n0 m1n1 m1n2 m2n0 m2n1 m2n2
47
+ Session 1 (null) (null) (null) (null) (null) (null) (null) (null) (null) (null) (null) (null)
@@ -0,0 +1,332 @@
1
+ import os
2
+ import numpy as np
3
+ from inspect import getsourcefile
4
+
5
+ import pynibs
6
+
7
+ # path of create_subject_XXXXX.py file (has to be in subjects root directoy
8
+ subject_folder = os.path.split(os.path.abspath(getsourcefile(lambda: 0)))[0]
9
+
10
+ # subject information
11
+ ###########################################################################################################
12
+ subject_id = 'testsub'
13
+ fn_subject_obj = subject_folder + f'/{subject_id}.hdf5'
14
+
15
+ # mri information
16
+ ###########################################################################################################
17
+ mri = [dict()]
18
+
19
+ mri[0]['fn_mri_T1'] = subject_folder + f'/mri/0/original/nifti/t1/2_T1_mprage_iso.nii.gz'
20
+ mri[0]['fn_mri_T2'] = subject_folder + f'/mri/0/original/nifti/t2/5_T2_cube_iso.nii.gz'
21
+ mri[0]['fn_mri_DTI'] = subject_folder + f'/mri/0/original/nifti/dti/7_HB4_diff_64dir_PA0_112.nii.gz'
22
+ mri[0]['fn_mri_DTI_rev'] = subject_folder + f'/mri/0/original/nifti/dti/8_HB4_diff_AP1_slice2.nii.gz'
23
+ mri[0]['fn_mri_DTI_bvec'] = subject_folder + f'/mri/0/original/nifti/dti/7_HB4_diff_64dir_PA0_112.bvec'
24
+ mri[0]['fn_mri_DTI_bval'] = subject_folder + f'/mri/0/original/nifti/dti/7_HB4_diff_64dir_PA0_112.bval'
25
+ mri[0]['dti_readout_time'] = '0.08214'
26
+ mri[0]['dti_phase_direction'] = 'y'
27
+
28
+ # mesh information
29
+ ###########################################################################################################
30
+ mesh = {'charm_refm1_sm': dict(), 'headreco': dict(), 'headreco_refined_m1': dict()}
31
+
32
+ mesh['charm_refm1_sm']['info'] = 'charm --v 1.0 (simnibs 4.0 beta)'
33
+ mesh['charm_refm1_sm']['approach'] = 'charm'
34
+ mesh['charm_refm1_sm']['mesh_folder'] = os.path.join(subject_folder, 'testsub/mesh', 'charm_refm1_sm')
35
+ mesh['charm_refm1_sm']['vertex_density'] = None
36
+ mesh['charm_refm1_sm']['fn_mesh_msh'] = os.path.join(mesh['charm_refm1_sm']['mesh_folder'], f'm2m_{subject_id}',
37
+ f'{subject_id}.msh')
38
+ mesh['charm_refm1_sm']['fn_mesh_hdf5'] = os.path.join(mesh['charm_refm1_sm']['mesh_folder'], f'm2m_{subject_id}',
39
+ f'{subject_id}.hdf5')
40
+ mesh['charm_refm1_sm']['fn_tensor_vn'] = f'm2m_{subject_id}/DTI_coregT1_tensor.nii.gz'
41
+ mesh['charm_refm1_sm']['mri_idx'] = 0
42
+ mesh['charm_refm1_sm']['fn_mri_conform'] = f"m2m_{subject_id}/T1.nii.gz"
43
+
44
+ mesh['charm_refm1_sm']['fn_lh_wm'] = None
45
+ mesh['charm_refm1_sm']['fn_rh_wm'] = None
46
+ mesh['charm_refm1_sm']['fn_lh_gm'] = None
47
+ mesh['charm_refm1_sm']['fn_rh_gm'] = None
48
+ mesh['charm_refm1_sm']['fn_lh_gm_curv'] = None
49
+ mesh['charm_refm1_sm']['fn_rh_gm_curv'] = None
50
+ mesh['charm_refm1_sm']['fn_lh_midlayer'] = f'm2m_{subject_id}/surfaces/lh.central.gii'
51
+ mesh['charm_refm1_sm']['fn_rh_midlayer'] = f'm2m_{subject_id}/surfaces/rh.central.gii'
52
+ mesh['charm_refm1_sm']['smooth_skin'] = .8
53
+ mesh['charm_refm1_sm']['refinement_roi'] = 'midlayer_m1s1pmd'
54
+ mesh['charm_refm1_sm']['refinemement_element_size'] = 1
55
+
56
+ mesh['headreco']['info'] = 'headreco --v 1.0 (simnibs 3.1)'
57
+ mesh['headreco']['approach'] = 'headreco'
58
+ mesh['headreco']['mesh_folder'] = os.path.join(subject_folder, 'testsub/mesh', 'headreco')
59
+ mesh['headreco']['vertex_density'] = 1.0
60
+ mesh['headreco']['fn_mesh_msh'] = os.path.join(mesh['headreco']['mesh_folder'], f'{subject_id}.msh')
61
+ mesh['headreco']['fn_mesh_hdf5'] = os.path.join(mesh['headreco']['mesh_folder'], f'{subject_id}.hdf5')
62
+ mesh['headreco']['fn_tensor_vn'] = f'd2c_{subject_id}_PA/CTI_vn_tensor.nii'
63
+ mesh['headreco']['mri_idx'] = 0
64
+ mesh['headreco']['fn_lh_wm'] = None
65
+ mesh['headreco']['fn_rh_wm'] = None
66
+ mesh['headreco']['fn_lh_gm'] = None
67
+ mesh['headreco']['fn_rh_gm'] = None
68
+ mesh['headreco']['fn_lh_gm_curv'] = None
69
+ mesh['headreco']['fn_rh_gm_curv'] = None
70
+ mesh['headreco']['fn_lh_midlayer'] = f'fs_{subject_id}/surf/lh.central'
71
+ mesh['headreco']['fn_rh_midlayer'] = f'fs_{subject_id}/surf/rh.central'
72
+
73
+ mesh['headreco_refined_m1']['info'] = 'headreco --v 1.0 (simnibs 3.1)'
74
+ mesh['headreco_refined_m1']['approach'] = 'headreco'
75
+ mesh['headreco_refined_m1']['mesh_folder'] = os.path.join(subject_folder, 'testsub/mesh', 'headreco_refined_m1')
76
+ mesh['headreco_refined_m1']['vertex_density'] = 1.0
77
+ mesh['headreco_refined_m1']['center'] = [-41.33, -49.37, 73.78]
78
+ mesh['headreco_refined_m1']['radius'] = 35
79
+ mesh['headreco_refined_m1']['element_size'] = 0.4
80
+ mesh['headreco_refined_m1']['refine_domains'] = ["wm", "gm", "csf"]
81
+ mesh['headreco_refined_m1']['fn_mesh_msh'] = os.path.join(mesh['headreco_refined_m1']['mesh_folder'],
82
+ f"{subject_id}.msh")
83
+ mesh['headreco_refined_m1']['fn_mesh_hdf5'] = os.path.join(mesh['headreco_refined_m1']['mesh_folder'],
84
+ f"{subject_id}.hdf5")
85
+ mesh['headreco_refined_m1']['fn_tensor_vn'] = f"d2c_{subject_id}/dti_results_T1space/DTI_conf_tensor.nii.gz"
86
+ mesh['headreco_refined_m1']['mri_idx'] = 0
87
+ mesh['headreco_refined_m1']['fn_mri_conform'] = f"{subject_id}_T1fs_conform.nii.gz"
88
+ mesh['headreco_refined_m1']['smooth_domains'] = ['skin']
89
+
90
+ mesh['headreco_refined_m1']['fn_lh_wm'] = None
91
+ mesh['headreco_refined_m1']['fn_rh_wm'] = None
92
+ mesh['headreco_refined_m1']['fn_lh_gm'] = None
93
+ mesh['headreco_refined_m1']['fn_rh_gm'] = None
94
+ mesh['headreco_refined_m1']['fn_lh_gm_curv'] = None
95
+ mesh['headreco_refined_m1']['fn_rh_gm_curv'] = None
96
+ mesh['headreco_refined_m1']['fn_lh_midlayer'] = f"fs_{subject_id}/surf/lh.central"
97
+ mesh['headreco_refined_m1']['fn_rh_midlayer'] = f"fs_{subject_id}/surf/rh.central"
98
+
99
+ # roi information (first index: mesh, second index: roi)
100
+ ###########################################################################################################
101
+ roi = {'headreco': {'midlayer_lh_rh': dict(), 'midlayer_m1s1pmd': dict()},
102
+ 'headreco_refined_m1': {'midlayer_lh_rh': dict(), 'midlayer_m1s1pmd': dict(),
103
+ 'midlayer_m1s1pmd_refined': dict()},
104
+ 'charm_refm1_sm': {'midlayer_lh_rh': dict(), 'midlayer_m1s1pmd': dict()}}
105
+
106
+ roi['charm_refm1_sm']['midlayer_lh_rh']['type'] = 'surface'
107
+ roi['charm_refm1_sm']['midlayer_lh_rh']['info'] = 'freesurfer lh + rh whole brain midlayer'
108
+ roi['charm_refm1_sm']['midlayer_lh_rh']['gm_surf_fname'] = [mesh['charm_refm1_sm']['fn_lh_gm'],
109
+ mesh['charm_refm1_sm']['fn_rh_gm']]
110
+ roi['charm_refm1_sm']['midlayer_lh_rh']['wm_surf_fname'] = [mesh['charm_refm1_sm']['fn_lh_wm'],
111
+ mesh['charm_refm1_sm']['fn_rh_wm']]
112
+ roi['charm_refm1_sm']['midlayer_lh_rh']['midlayer_surf_fname'] = [mesh['charm_refm1_sm']['fn_lh_midlayer'],
113
+ mesh['charm_refm1_sm']['fn_rh_midlayer']]
114
+ roi['charm_refm1_sm']['midlayer_lh_rh']['delta'] = 0.5
115
+ roi['charm_refm1_sm']['midlayer_lh_rh']['refine'] = False
116
+ roi['charm_refm1_sm']['midlayer_lh_rh']['X_ROI'] = None
117
+ roi['charm_refm1_sm']['midlayer_lh_rh']['Y_ROI'] = None
118
+ roi['charm_refm1_sm']['midlayer_lh_rh']['Z_ROI'] = None
119
+ roi['charm_refm1_sm']['midlayer_lh_rh']['layer'] = 3
120
+ roi['charm_refm1_sm']['midlayer_lh_rh']['fn_mask'] = None
121
+ roi['charm_refm1_sm']['midlayer_lh_rh']['fn_mask_avg'] = None
122
+
123
+ roi['charm_refm1_sm']['midlayer_m1s1pmd']['type'] = 'surface'
124
+ roi['charm_refm1_sm']['midlayer_m1s1pmd']['info'] = 'freesurfer PMd, M1 and somatosensory cortex'
125
+ roi['charm_refm1_sm']['midlayer_m1s1pmd']['gm_surf_fname'] = mesh['charm_refm1_sm']['fn_lh_gm']
126
+ roi['charm_refm1_sm']['midlayer_m1s1pmd']['wm_surf_fname'] = mesh['charm_refm1_sm']['fn_lh_wm']
127
+ roi['charm_refm1_sm']['midlayer_m1s1pmd']['midlayer_surf_fname'] = mesh['charm_refm1_sm']['fn_lh_midlayer']
128
+ roi['charm_refm1_sm']['midlayer_m1s1pmd']['delta'] = 0.5
129
+ roi['charm_refm1_sm']['midlayer_m1s1pmd']['refine'] = False
130
+ roi['charm_refm1_sm']['midlayer_m1s1pmd']['X_ROI'] = None
131
+ roi['charm_refm1_sm']['midlayer_m1s1pmd']['Y_ROI'] = None
132
+ roi['charm_refm1_sm']['midlayer_m1s1pmd']['Z_ROI'] = None
133
+ roi['charm_refm1_sm']['midlayer_m1s1pmd']['layer'] = 3
134
+ roi['charm_refm1_sm']['midlayer_m1s1pmd']['fn_mask'] = f"roi/midlayer_m1s1pmd/mask_{subject_id}m1pmdss.mgh"
135
+ roi['charm_refm1_sm']['midlayer_m1s1pmd']['fn_mask_avg'] = '/lefthandknob_M1S1PMd.overlay'
136
+ roi['charm_refm1_sm']['midlayer_m1s1pmd']['hemisphere'] = "lh"
137
+
138
+ roi['headreco']['midlayer_lh_rh']['type'] = 'surface'
139
+ roi['headreco']['midlayer_lh_rh']['info'] = 'freesurfer lh + rh whole brain midlayer'
140
+ roi['headreco']['midlayer_lh_rh']['gm_surf_fname'] = [mesh['headreco']['fn_lh_gm'], mesh['headreco']['fn_rh_gm']]
141
+ roi['headreco']['midlayer_lh_rh']['wm_surf_fname'] = [mesh['headreco']['fn_lh_wm'], mesh['headreco']['fn_rh_wm']]
142
+ roi['headreco']['midlayer_lh_rh']['midlayer_surf_fname'] = [mesh['headreco']['fn_lh_midlayer'],
143
+ mesh['headreco']['fn_rh_midlayer']]
144
+ roi['headreco']['midlayer_lh_rh']['delta'] = 0.5
145
+ roi['headreco']['midlayer_lh_rh']['refine'] = False
146
+ roi['headreco']['midlayer_lh_rh']['X_ROI'] = None
147
+ roi['headreco']['midlayer_lh_rh']['Y_ROI'] = None
148
+ roi['headreco']['midlayer_lh_rh']['Z_ROI'] = None
149
+ roi['headreco']['midlayer_lh_rh']['layer'] = 3
150
+ roi['headreco']['midlayer_lh_rh']['fn_mask'] = None
151
+ roi['headreco']['midlayer_lh_rh']['fn_mask_avg'] = None
152
+
153
+ roi['headreco']['midlayer_m1s1pmd']['type'] = 'surface'
154
+ roi['headreco']['midlayer_m1s1pmd']['info'] = 'freesurfer PMd, M1 and somatosensory cortex'
155
+ roi['headreco']['midlayer_m1s1pmd']['gm_surf_fname'] = mesh['headreco']['fn_lh_gm']
156
+ roi['headreco']['midlayer_m1s1pmd']['wm_surf_fname'] = mesh['headreco']['fn_lh_wm']
157
+ roi['headreco']['midlayer_m1s1pmd']['midlayer_surf_fname'] = mesh['headreco']['fn_lh_midlayer']
158
+ roi['headreco']['midlayer_m1s1pmd']['delta'] = 0.5
159
+ roi['headreco']['midlayer_m1s1pmd']['refine'] = False
160
+ roi['headreco']['midlayer_m1s1pmd']['X_ROI'] = None
161
+ roi['headreco']['midlayer_m1s1pmd']['Y_ROI'] = None
162
+ roi['headreco']['midlayer_m1s1pmd']['Z_ROI'] = None
163
+ roi['headreco']['midlayer_m1s1pmd']['layer'] = 3
164
+ roi['headreco']['midlayer_m1s1pmd']['fn_mask'] = f"roi/midlayer_m1s1pmd/mask_{subject_id}m1pmdss.mgh"
165
+ roi['headreco']['midlayer_m1s1pmd']['fn_mask_avg'] = '/masks/lefthandknob_M1S1PMd.overlay'
166
+ roi['headreco']['midlayer_m1s1pmd']['hemisphere'] = "lh"
167
+
168
+ roi_id = 'midlayer_lh_rh'
169
+ roi['headreco_refined_m1'][roi_id]['type'] = 'surface'
170
+ roi['headreco_refined_m1'][roi_id]['info'] = 'freesurfer lh + rh whole brain midlayer'
171
+ roi['headreco_refined_m1'][roi_id]['gm_surf_fname'] = [mesh['headreco_refined_m1']['fn_lh_gm'],
172
+ mesh['headreco_refined_m1']['fn_rh_gm']]
173
+ roi['headreco_refined_m1'][roi_id]['wm_surf_fname'] = [mesh['headreco_refined_m1']['fn_lh_wm'],
174
+ mesh['headreco_refined_m1']['fn_rh_wm']]
175
+ roi['headreco_refined_m1'][roi_id]['midlayer_surf_fname'] = [mesh['headreco_refined_m1']['fn_lh_midlayer'],
176
+ mesh['headreco_refined_m1']['fn_rh_midlayer']]
177
+ roi['headreco_refined_m1'][roi_id]['refine'] = False
178
+ roi['headreco_refined_m1'][roi_id]['delta'] = 0.5
179
+ roi['headreco_refined_m1'][roi_id]['X_ROI'] = None
180
+ roi['headreco_refined_m1'][roi_id]['Y_ROI'] = None
181
+ roi['headreco_refined_m1'][roi_id]['Z_ROI'] = None
182
+ roi['headreco_refined_m1'][roi_id]['layer'] = 3
183
+ roi['headreco_refined_m1'][roi_id]['fn_mask'] = None
184
+ roi['headreco_refined_m1'][roi_id]['fn_mask_avg'] = None
185
+
186
+ roi_id = 'midlayer_m1s1pmd'
187
+ roi['headreco_refined_m1'][roi_id]['type'] = 'surface'
188
+ roi['headreco_refined_m1'][roi_id]['info'] = 'freesurfer PMd, M1 and somatosensory cortex'
189
+ roi['headreco_refined_m1'][roi_id]['gm_surf_fname'] = mesh['headreco_refined_m1']['fn_lh_gm']
190
+ roi['headreco_refined_m1'][roi_id]['wm_surf_fname'] = mesh['headreco_refined_m1']['fn_lh_wm']
191
+ roi['headreco_refined_m1'][roi_id]['midlayer_surf_fname'] = mesh['headreco_refined_m1']['fn_lh_midlayer']
192
+ roi['headreco_refined_m1'][roi_id]['refine'] = False
193
+ roi['headreco_refined_m1'][roi_id]['delta'] = 0.5
194
+ roi['headreco_refined_m1'][roi_id]['X_ROI'] = None
195
+ roi['headreco_refined_m1'][roi_id]['Y_ROI'] = None
196
+ roi['headreco_refined_m1'][roi_id]['Z_ROI'] = None
197
+ roi['headreco_refined_m1'][roi_id]['layer'] = 3
198
+ roi['headreco_refined_m1'][roi_id]['fn_mask'] = f"roi/midlayer_m1s1pmd/mask_{subject_id}m1pmdss.mgh"
199
+ roi['headreco_refined_m1'][roi_id]['fn_mask_avg'] = '//masks/lefthandknob_M1S1PMd.overlay'
200
+ roi['headreco_refined_m1'][roi_id]['hemisphere'] = "lh"
201
+
202
+ roi_id = 'midlayer_m1s1pmd_refined'
203
+ roi['headreco_refined_m1'][roi_id]['type'] = 'surface'
204
+ roi['headreco_refined_m1'][roi_id]['info'] = 'freesurfer PMd, M1 and somatosensory cortex'
205
+ roi['headreco_refined_m1'][roi_id]['gm_surf_fname'] = mesh['headreco_refined_m1']['fn_lh_gm']
206
+ roi['headreco_refined_m1'][roi_id]['wm_surf_fname'] = mesh['headreco_refined_m1']['fn_lh_wm']
207
+ roi['headreco_refined_m1'][roi_id]['midlayer_surf_fname'] = mesh['headreco_refined_m1']['fn_lh_midlayer']
208
+ roi['headreco_refined_m1'][roi_id]['refine'] = True
209
+ roi['headreco_refined_m1'][roi_id]['delta'] = 0.5
210
+ roi['headreco_refined_m1'][roi_id]['X_ROI'] = None
211
+ roi['headreco_refined_m1'][roi_id]['Y_ROI'] = None
212
+ roi['headreco_refined_m1'][roi_id]['Z_ROI'] = None
213
+ roi['headreco_refined_m1'][roi_id]['layer'] = 3
214
+ roi['headreco_refined_m1'][roi_id]['fn_mask'] = f"roi/midlayer_m1s1pmd/mask_{subject_id}m1pmdss.mgh"
215
+ roi['headreco_refined_m1'][roi_id]['fn_mask_avg'] = '//masks/lefthandknob_M1S1PMd.overlay'
216
+ roi['headreco_refined_m1'][roi_id]['hemisphere'] = "lh"
217
+
218
+ # experiment information
219
+ ###########################################################################################################
220
+ exp = {'TMS_localite': dict(), 'TMS_ant': dict(), 'TMS_brainsight': dict()}
221
+
222
+ exp['TMS_localite']['info'] = ['TMS-MEP template Localite (MPI)']
223
+ exp['TMS_localite']['date'] = ['XX/XX/20XX']
224
+ exp['TMS_localite']['nnav_system'] = 'Localite'
225
+ exp['TMS_localite']['fn_tms_nav'] = [[subject_folder + '...xml', subject_folder + '...xml']]
226
+ exp['TMS_localite']['fn_data'] = [[subject_folder + '/exp/0/mep/...cfs']]
227
+ exp['TMS_localite']['fn_intensity'] = None
228
+ exp['TMS_localite']['mep_onsets'] = [[0]]
229
+ exp['TMS_localite']['fn_exp_csv'] = [subject_folder + '/exp/0/experiment.csv']
230
+ exp['TMS_localite']['fn_exp_hdf5'] = [subject_folder + '/exp/0/experiment.hdf5']
231
+ exp['TMS_localite']['fn_coil'] = [['.../MagStim_Alpha_Coil_70mm_Fig8.nii.gz']]
232
+ exp['TMS_localite']['fn_mri_nii'] = [[subject_folder + '/exp/0/..._conform.nii']]
233
+ exp['TMS_localite']['cond'] = [['']]
234
+ exp['TMS_localite']['tms_pulse_time'] = None
235
+ exp['TMS_localite']['experimenter'] = ''
236
+ exp['TMS_localite']['mep_fit_info'] = ['']
237
+ exp['TMS_localite']['incidents'] = ['']
238
+ exp['TMS_localite']['postproc'] = [dict()]
239
+ exp['TMS_localite']['postproc'][0]['info'] = ' '
240
+ exp['TMS_localite']['postproc'][0]['cmd'] = ' '
241
+
242
+ exp['TMS_ant']['info'] = ['TMS-MEP-EEG template (ANT)']
243
+ exp['TMS_ant']['date'] = ['XX/XX/20XX']
244
+ exp['TMS_ant']['nnav_system'] = 'Visor'
245
+ exp['TMS_ant']['fn_data'] = [[subject_folder + '/exp/2/...cnt']]
246
+ exp['TMS_ant']['fn_exp_hdf5'] = [subject_folder + '/exp/2/experiment.hdf5']
247
+ exp['TMS_ant']['fn_coil'] = [['.../MagStim_Alpha_Coil_70mm_Fig8.nii.gz']]
248
+ exp['TMS_ant']['fn_mri_nii'] = [[subject_folder + '/exp/2/..._conform.nii']]
249
+ exp['TMS_ant']['fn_visor_cnt'] = [subject_folder + '/exp/2/...pos.cnt']
250
+ exp['TMS_ant']['fn_visor_calibration'] = [subject_folder + '/exp/2/...calibration.xml']
251
+ exp['TMS_ant']['fn_eeg_cnt'] = [subject_folder + '/exp/2/eeg/...cnt']
252
+ exp['TMS_ant']['eeg_channels'] = ['all']
253
+ exp['TMS_ant']['fn_emg_cnt'] = [subject_folder + '/exp/2/emg/...cnt']
254
+ exp['TMS_ant']['emg_channels'] = [0]
255
+ exp['TMS_ant']['emg_max_duration'] = [10]
256
+ exp['TMS_ant']['eeg_max_duration'] = [10]
257
+ exp['TMS_ant']['emg_trigger_value'] = ['4']
258
+ exp['TMS_ant']['eeg_trigger_value'] = ['1']
259
+ exp['TMS_ant']['cond'] = [['M1_random']]
260
+ exp['TMS_ant']['tms_pulse_time'] = None
261
+ exp['TMS_ant']['experimenter'] = ' '
262
+ exp['TMS_ant']['mep_fit_info'] = [' ']
263
+ exp['TMS_ant']['incidents'] = [' ']
264
+ exp['TMS_ant']['fiducal_corr'] = [[0, 0, 0]] # x,y,z in mm
265
+
266
+ exp['TMS_brainsight']['info'] = ['TMS-MEP-EEG template (Brainsight)']
267
+ exp['TMS_brainsight']['date'] = ['09/03/20222']
268
+ exp['TMS_brainsight']['nnav_system'] = 'Brainsight'
269
+ exp['TMS_brainsight']['fn_data'] = [subject_folder + '/Data_testsub.txt']
270
+ exp['TMS_brainsight']['fn_exp_hdf5'] = [subject_folder + '/exp/random/experiment.hdf5']
271
+ exp['TMS_brainsight']['fn_coil'] = [['.../Magstim_D70_AFC_force_sensor.ccd.nii.gz']]
272
+ exp['TMS_brainsight']['fn_mri_nii'] = [[subject_folder + '/exp/random/testsub_T1.nii.gz']]
273
+ exp['TMS_brainsight']['cond'] = [['M1_random']]
274
+ exp['TMS_brainsight']['tms_pulse_time'] = None
275
+ exp['TMS_brainsight']['experimenter'] = 'Zijian'
276
+ exp['TMS_brainsight']['mep_fit_info'] = [' ']
277
+ exp['TMS_brainsight']['incidents'] = [' ']
278
+ exp['TMS_brainsight']['fiducal_corr'] = [[0, 0, 0]] # x,y,z in mm
279
+
280
+ # add plot settings
281
+ ###########################################################################################################
282
+ ps = []
283
+
284
+ ps.append(pynibs.create_plot_settings_dict(plotfunction_type='surface_vector_plot'))
285
+ ps[0]['info'] = ' '
286
+ ps[0]['plot_function'] = 'surface_vector_plot'
287
+ ps[0]['fname_in'] = '..._data.xdmf'
288
+ ps[0]['fname_png'] = '...png'
289
+ ps[0]['png_resolution'] = 1.0
290
+ ps[0]['quantity'] = [' ']
291
+ ps[0]['vlabels'] = None
292
+ ps[0]['vscales'] = None
293
+ ps[0]['datarange'] = [None, None]
294
+ ps[0]['domain_label'] = 'tissue_type'
295
+ ps[0]['domain_IDs'] = 0
296
+ ps[0]['colorbar_label'] = ' '
297
+ ps[0]['colorbar_position'] = [0.45, -0.05]
298
+ ps[0]['colorbar_orientation'] = 'Horizontal'
299
+ ps[0]['colorbar_aspectratio'] = 20
300
+ ps[0]['colorbar_titlefontsize'] = 12
301
+ ps[0]['colorbar_labelfontsize'] = 12
302
+ ps[0]['colorbar_labelformat'] = '%-#6.1f'
303
+ ps[0]['colorbar_numberoflabels'] = 5
304
+ ps[0]['colorbar_labelcolor'] = [0, 0, 0]
305
+ ps[0]['view'] = [[-332.040630013204, -16.8948837495393, 256.721941018442],
306
+ [-35.3111635316966, -13.6999528376981, 36.4196465112876],
307
+ [0.588834647614276, -0.167617710066906, 0.790682022712606],
308
+ [30, 0, 0]]
309
+ ps[0]['interpolate'] = True
310
+ ps[0]['edges'] = False
311
+ ps[0]['axes'] = False
312
+ ps[0]['colormap'] = 'Rainbow Blended White'
313
+ ps[0]['opacitymap'] = None
314
+ ps[0]['vscale_mode'] = ['off']
315
+ ps[0]['vector_mode'] = {'Every Nth Point': 10}
316
+ ps[0]['vcolor'] = None
317
+ ps[0]['background_color'] = np.array([1, 1, 1])
318
+ ps[0]['viewsize'] = np.array([1000, 1000])
319
+
320
+ # save subject information in .hdf5 file
321
+ ###########################################################################################################
322
+ pynibs.save_subject_hdf5(fname=fn_subject_obj,
323
+ mri_dict=mri,
324
+ mesh_dict=mesh,
325
+ roi_dict=roi,
326
+ exp_dict=exp,
327
+ ps_dict=ps,
328
+ subject_id=subject_id,
329
+ subject_folder=subject_folder
330
+ )
331
+
332
+ print(f'Created subject .hdf5 file: {fn_subject_obj}')
Binary file
Binary file