Commit 39dae2b6 authored by mikeCplus's avatar mikeCplus
Browse files

updated string swap documentation in the pipeline scripts, and modified some default config params

parent 2d37fd43
......@@ -4,44 +4,44 @@ exec_func
ef_sbatch
replace_string
[in_path],[]
[montage_info],[-.14,-22,-48,-.07,0,-1.57,1080,1260,1240]
[staging_script],derivatives/lossless/code/scripts/face13_staging.m
[montage_info],
[staging_script],derivatives/lossless/code/scripts/staging_script.m
[aref_trim],30
[recur_sec],1
[limit_sec],[0 1]
[sd_t_meth],na
[sd_t_vals],[.15 .85]
[sd_t_o],3
[sd_t_meth],q
[sd_t_vals],[.3 .7]
[sd_t_o],6
[sd_t_f_meth],fixed
[sd_t_f_vals],
[sd_t_f_o],.2
[sd_t_pad],1
[sd_ch_meth],q
[sd_ch_vals],[.15 .85]
[sd_ch_o],3
[sd_ch_vals],[.3 .7]
[sd_ch_o],6
[sd_ch_f_meth],fixed
[sd_ch_f_vals],
[sd_ch_f_o],.2
[sd_ch_f_vals],
[sd_ch_f_o],.2
[ref_loc_file],derivatives/lossless/code/misc/standard_1020_bucanl19.elc
[low_bound_hz],1
[high_bound_hz],30
[low_bound_hz],
[high_bound_hz],
[save_f_res],1
[n_nbr_ch],3
[r_ch_meth],q
[r_ch_vals],[.15,.85]
[r_ch_o],3
[r_ch_vals],[.3 .7]
[r_ch_o],6
[r_ch_f_meth],fixed
[r_ch_f_vals],
[r_ch_f_o],.2
[r_ch_f_vals],
[r_ch_f_o],.2
[bridge_trim],40
[bridge_z],6
[n_nbr_t],3
[r_t_meth],q
[r_t_vals],[.15 .85]
[r_t_o],3
[r_t_vals],[.3 .7]
[r_t_o],6
[r_t_f_meth],fixed
[r_t_f_vals],
[r_t_f_o],.2
[r_t_f_vals],
[r_t_f_o],.2
[min_gap_ms],2000
[out_path],derivatives/lossless
[amica_param_file],derivatives/lossless/code/misc/amica15_default.param
......@@ -59,19 +59,18 @@ job_init
m_init
derivatives/lossless/code/config/octave.minit
submit_options
--account=def-jdesjard
--account=def-bucanl
memory
16g
8g
time_limit
30m
1h
mpi
false
num_tasks
1
threads_per_task
software
octave
program_options
......@@ -4,8 +4,8 @@ exec_func
ef_sbatch
replace_string
[dep_path],derivatives/lossless/code/dependencies/eeglab_asr_amica/plugins/amica
[in_path],analysis/data/2_preproc
[amica_ver],amica15
[in_path],analysis/data/2_preproc
[amica_ver],amica15
order
[2 1]
session_init
......@@ -15,22 +15,23 @@ job_name
mfile_name
[/,-1,batch_dfn,.,-1]
job_init
derivatives/lossless/code/config/amica.jobinit
derivatives/lossless/code/config/amica.jobinit
m_init
submit_options
--account=def-jdesjard
--account=def-bucanl
memory
2G
time_limit
1h
2h
mpi
true
num_processors
num_tasks
threads_per_task
8
software
none
program_options
......@@ -7,15 +7,15 @@ replace_string
[recur_sec],1
[limit_sec],[0 1]
[sd_t_meth],q
[sd_t_vals],[.15 .85]
[sd_t_o],3
[sd_t_vals],[.3 .7]
[sd_t_o],6
[sd_t_f_meth],fixed
[sd_t_f_vals],
[sd_t_f_o],.2
[sd_t_f_vals],
[sd_t_f_o],.2
[min_gap_ms],2000
[out_path],derivatives/lossless
[amica_param_file],derivatives/lossless/code/misc/amica_default.param
[amica_threads_s07_08_09],8
[amica_threads_s04],8
order
[3 2]
session_init
......@@ -29,13 +29,18 @@ job_init
m_init
derivatives/lossless/code/config/octave.minit
submit_options
--account=def-jdesjard
--account=def-bucanl
memory
16g
8g
time_limit
30m
1h
mpi
false
num_tasks
threads_per_task
software
octave
program_options
......@@ -4,8 +4,8 @@ exec_func
ef_sbatch
replace_string
[dep_path],derivatives/lossless/code/dependencies/eeglab_asr_amica/plugins/amica
[in_path],analysis/data/2_preproc
[amica_ver],amica15
[in_path],analysis/data/2_preproc
[amica_ver],amica15
order
[4 3]
session_init
......@@ -15,19 +15,19 @@ job_name
mfile_name
[/,-1,batch_dfn,.,-1]
job_init
derivatives/lossless/code/config/amica.jobinit
derivatives/lossless/code/config/amica.jobinit
m_init
submit_options
--account=def-jdesjard
--account=def-bucanl
memory
2G
time_limit
2h
mpi
true
num_processors
num_tasks
threads_per_task
8
software
......
......@@ -4,8 +4,8 @@ exec_func
ef_sbatch
replace_string
[dep_path],derivatives/lossless/code/dependencies/eeglab_asr_amica/plugins/amica
[in_path],analysis/data/2_preproc
[amica_ver],amica15
[in_path],analysis/data/2_preproc
[amica_ver],amica15
order
[4 3]
session_init
......@@ -19,15 +19,15 @@ job_init
m_init
submit_options
--account=def-jdesjard
--account=def-bucanl
memory
2G
time_limit
2h
mpi
true
num_processors
num_tasks
threads_per_task
8
software
......
......@@ -4,8 +4,8 @@ exec_func
ef_sbatch
replace_string
[dep_path],derivatives/lossless/code/dependencies/eeglab_asr_amica/plugins/amica
[in_path],analysis/data/2_preproc
[amica_ver],amica15
[in_path],analysis/data/2_preproc
[amica_ver],amica15
order
[4 3]
session_init
......@@ -19,15 +19,15 @@ job_init
m_init
submit_options
--account=def-jdesjard
--account=def-bucanl
memory
2G
1G
time_limit
2h
1h
mpi
true
num_processors
num_tasks
threads_per_task
8
software
......
......@@ -3,25 +3,24 @@ file_name
exec_func
ef_sbatch
replace_string
[in_path],derivatives/lossless
[recur_sec],1
[limit_sec],[0 1]
[sd_t_meth],q
[sd_t_vals],[.15 .85]
[sd_t_o],3
[sd_t_f_meth],fixed
[sd_t_f_vals],
[sd_t_f_o],.2
[min_gap_ms],2000
[icr_crit],0.05
[dip_vol], derivatives/lossless/code/misc/standard_vol.mat
[dip_mri], derivatives/lossless/code/misc/standard_mri.mat
[dip_elc], derivatives/lossless/code/misc/standard_1020.elc
[dip_transmat], [0 0 0 0 0 0 1 1 1]
[cor_transmat], [0,0,0,0,0,1.57,1,1,1]
[cor_nosedir], +X
[out_path],derivatives/lossless
[in_path],derivatives/lossless
[recur_sec],1
[limit_sec],[0 1]
[sd_t_meth],q
[sd_t_vals],[.3 .7]
[sd_t_o],6
[sd_t_f_meth],fixed
[sd_t_f_vals],
[sd_t_f_o],.2
[min_gap_ms],2000
[icr_crit],0.05
[dip_vol], derivatives/lossless/code/misc/standard_vol.mat
[dip_mri], derivatives/lossless/code/misc/standard_mri.mat
[dip_elc], derivatives/lossless/code/misc/standard_1020.elc
[dip_transmat], [0 0 0 0 0 0 1 1 1]
[cor_transmat], [0,0,0,0,0,1.57,1,1,1]
[cor_nosedir], +X
[out_path],derivatives/lossless
order
[5 4]
session_init
......@@ -35,19 +34,18 @@ job_init
m_init
derivatives/lossless/code/config/octave.minit
submit_options
--account=def-jdesjard
--account=def-bucanl
memory
8g
time_limit
1h
2h
mpi
false
num_processors
num_tasks
threads_per_task
8
software
octave
program_options
\ No newline at end of file
......@@ -10,36 +10,48 @@
% in_path = [in_path] Relative path to input data files assuming cd = work_path
% montage_info = [montage_info] Montage information to fit channel locations on a standard surface.
% This can be a transformations matrix (e.g. [-.14,-22,-48,-.07,0,-1.57,1080,1260,1240])
% ... or a a file contasining a transformation matrix (e.g. [batch_dfn]_transmat.mat).
% ... or a a file containing a transformation matrix (e.g. [batch_dfn]_transmat.mat).
% ... or a BIDS channel location tsv file (assuming that during BIDS init the channels were coregistered to the standard surface).
% staging_script = [staging_script] Scipt file path/name that creates marks based on events in the raw data file.
% aref_trim = [aref_trim] Trim of mean for initial average rereference (e.g. 30 = 15% off each side)
% recur_sec = [recur_sec] Recurrence (sec) for artifact detection epoching (e.g. .5, Default 1)
% limit_sec = [limit_sec] Limits (sec) for artifact detection epoching (e.g. [-.5 0], Default [0 recur_sec])
% sd_epoch_z = [sd_epoch_z] z threshold for flagging epochs during standard deviation criteria (e.g. 6)
% sd_epoch_p = [sd_epoch_p] Percentage of flagged channels required to flag an epoch during standard deviation criteria (e.g. .1)
% sd_epoch_trim = [sd_epoch_trim] Percentage trim for confidence intervals during epoch standard deviation criteria (10 = 5% top and bottom)
% sd_epoch_pad = [sd_epoch_pad] Number of windows to pad onto each side of the ch_sd time flag
% sd_chan_z = [sd_chan_z] z threshold for flagging channel during standard deviation criteria (e.g. 6)
% sd_chan_p = [sd_chan_p] Percentage of flagged epochs required to flag a channel during standard deviation criteria (e.g. .1)
% sd_chan_trim = [sd_chan_trim] Percentage trim for confidence intervals during channel standard deviation criteria (10 = 5% top and bottom)
% sd_t_meth = [sd_t_meth] Method used for flagging epochs (e.g. 'q' (quantiles), or 'na' (default))
% sd_t_vals = [sd_t_vals] Percentage trim for confidence intervals during epoch standard deviation criteria (e.g. [.3 .7])
% sd_t_o = [sd_t_o] z threshold for flagging epochs during standard deviation criteria (e.g. 6)
% sd_t_f_meth = [sd_t_f_meth] Fixed method used for flagging epochs (should be 'fixed')
% sd_t_f_vals = [sd_t_f_vals] Percentage trim for confidence intervals during epoch standard deviation criteria (e.g. [.3 .7], leave empty for 'fixed')
% sd_t_f_o = [sd_t_f_o] z threshold for flagging epochs during fixed standard deviation criteria (e.g. .2)
% sd_t_pad = [sd_t_pad] Number of windows to pad onto each side of the ch_sd time flag
% sd_ch_meth = [sd_ch_meth] Method used for flagging channels (e.g. 'q' (quantiles), or 'na' (default))
% sd_ch_vals = [sd_ch_vals] Percentage trim for confidence intervals during channel standard deviation criteria (e.g. [.3 .7])
% sd_ch_o = [sd_ch_o] z threshold for flagging channels during standard deviation criteria (e.g. 6)
% sd_ch_f_meth = [sd_ch_f_meth] Fixed method used for flagging channels (should be 'fixed')
% sd_ch_f_vals = [sd_ch_f_vals] Percentage trim for confidence intervals during channel standard deviation criteria (e.g. [.3 .7], leave empty for 'fixed')
% sd_ch_f_o = [sd_ch_f_o] z threshold for flagging channel during fixed standard deviation criteria (e.g. 6)
% ref_loc_file = [ref_loc_file] Name of file containing the reference locations (including the relative path)
% low_bound_hz = [low_bound_hz] Lower bound of the filter bass-band
% high_bound_hz = [high_bound_hz] Upper bound of the filter bass-band
% n_neighb_chan = [n_neighb_chan] Number of channels to use in nearest neighbour r calculation (for channel criteria)
% r_chan_z = [r_chan_z] z threshold for flagging channel during neighbour r criteria (e.g. 3)
% r_chan_p = [r_chan_p] Percentage of flagged epochs required to flag a channel during neighbour r criteria (e.g. .1)
% r_chan_trim = [r_chan_trim] Percentage trim for confidence intervals during channel neighbour r criteria (10 = 5% top and bottom)
% save_f_res = [save_f_res] 1 if you want to save the filter residuals (Default: 1)
% n_nbr_ch = [n_nbr_ch] Number of channels to use in nearest neighbour r calculation (for channel criteria)
% r_ch_meth = [sd_ch_meth] Method used for flagging low r channels (e.g. 'q' (quantiles), or 'na' (default))
% r_ch_vals = [sd_ch_vals] Percentage trim for confidence intervals during low r channel standard deviation criteria (e.g. [.3 .7])
% r_ch_o = [r_ch_o] z threshold for flagging channel during neighbour r criteria (e.g. 3)
% r_ch_f_meth = [r_ch_f_meth] Fixed method used for flagging low r channels (should be 'fixed')
% r_ch_f_vals = [r_ch_f_vals] Percentage trim for confidence intervals during low r channel standard deviation criteria (e.g. [.3 .7], leave empty for 'fixed')
% r_ch_f_o = [r_ch_f_o] z threshold for flagging channel during fixed neighbour r criteria (e.g. 3)
% bridge_trim = [bridge_trim] Percentage trim for z calculation of bridged channels (e.g. 40 = 20% top and bottom)
% bridge_z = [bridge_z] z threshold for flagging channel during bridging criteria (e.g. 8)
% n_neighb_epoch = [n_neighb_epoch] Number of channels to use in nearest neighbour r calculation (for epoch criteria)
% epoch_z = [epoch_z] z threshold for flagging epochs during neighbour r criteria (e.g. 3)
% epoch_p = [epoch_p] Percentage of flagged channels required to flag an epoch during neighbour r criteria (e.g. .1)
% epoch_trim = [epoch_trim] Percentage trim for confidence intervals during epoch neighbour r criteria (10 = 5% top and bottom)
% n_nbr_t = [n_nbr_t] Number of channels to use in nearest neighbour r calculation (for epoch criteria)
% r_t_meth = [r_t_meth] Method used for flagging low r epochs (e.g. 'q' (quantiles), or 'na' (default))
% r_t_vals = [r_t_vals] Percentage trim for confidence intervals during low r epoch standard deviation criteria (e.g. [.3 .7])
% r_t_o = [r_t_o] z threshold for flagging epochs during neighbour r criteria (e.g. 3)
% r_t_f_meth = [r_t_f_meth] Fixed method used for flagging low r epochs (should be 'fixed')
% r_t_f_vals = [r_t_f_vals] Percentage trim for confidence intervals during low r epoch standard deviation criteria (e.g. [.3 .7], leave empty for 'fixed')
% r_t_f_o = [r_t_f_o] z threshold for flagging epochs during fixed neighbour r criteria (e.g. 3)
% min_gap_ms = [min_gap_ms] Minimum time (ms) to allow between periods marked for rejection
% out_path = [out_path] Relative path to output data files assuming cd = work_path
% amica_param_file = [amica_param_file] template amicadefs.param file to modify.
% save_diff = [savediff] YES if you want to save the filter residuals (Default: NO)
% amica_param_file = [amica_param_file] template amicadefs.param file to modify
% amica_threads_s02 = [amica_threads_s02] number of threads to use for running s02 amica script (Default: 8)
%% CHECK FOR OUTPUT PATH AND CRETAE IF NECESSARY
if ~exist('[out_path]/[batch_dfn,/,-1]','dir');
......@@ -85,7 +97,7 @@ end
%warp locations to standard head surface:
if ~isempty('[montage_info]');
if isempty(str2num('[montage_info]'));
%if it is a BIDS channel tsv, load the tsv,
%if it is a BIDS channel tsv, load the tsv,sd_t_f_vals
%else read the file that is assumed to be a transformation matrix.
else
EEG = warp_locs( EEG,'[ref_loc_file]', ...
......
......@@ -11,12 +11,16 @@
% data_path = [in_path] Path to input and output data files assuming cd = work_path
% recur_sec = [recur_sec] Recurrence (sec) for artifact detection epoching (e.g. .3)
% limit_sec = [limit_sec] Limits (sec) for artifact detection epoching (e.g. [-.3 .3])
% epoch_z = [epoch_z] z threshold for flagging channel during icsd criteria (e.g. 3)
% epoch_p = [epoch_p] Percentage of flagged components required to flag an epoch during icsd criteria (e.g. .1)
% epoch_trim = [epoch_trim] Percentage trim for confidence intervals during channel neighbour r criteria (10 = 5% top and bottom)
% min_gap_ms = [min_gap_ms] Minimum time (ms) to allow between periods marked for rejection
% amica_param_file = [amica_param_file] Template amicadefs.param file to modify.
% sd_t_meth = [sd_t_meth] Method used for flagging epochs (e.g. 'q' (quantiles), or 'na' (default))
% sd_t_vals = [sd_t_vals] Percentage trim for confidence intervals during epoch standard deviation criteria (e.g. [.3 .7])
% sd_t_o = [sd_t_o] z threshold for flagging epochs during standard deviation criteria (e.g. 6)
% sd_t_f_meth = [sd_t_f_meth] Fixed method used for flagging epochs (should be 'fixed')
% sd_t_f_vals = [sd_t_f_vals] Percentage trim for confidence intervals during epoch standard deviation criteria (e.g. [.3 .7], leave empty for 'fixed')
% sd_t_f_o = [sd_t_f_o] z threshold for flagging epochs during fixed standard deviation criteria (e.g. .2)
% out_path = [out_path] Relative path to output data files assuming cd = work_path
% min_gap_ms = [min_gap_ms] Minimum time (ms) to allow between periods marked for rejection
% amica_param_file = [amica_param_file] template amicadefs.param file to modify
% amica_threads_s04 = [amica_threads_s04] number of threads to use for running s04a, s04b, s04c amica scripts (Default: 8)
%% LOAD SA DATASET
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
......@@ -191,7 +195,7 @@ swapstr=file_strswap('[amica_param_file]', ...
'[repstr_outpath]','[out_path]/[batch_dfn,_,-1]_amicaout_A', ...
'[repstr_nbchan]', num2str(EEG.nbchan), ...
'[repstr_pnts]', sprintf('%12.0f',EEG.pnts), ...
'[repstr_tpp]', '[amica_threads_s07_08_09]', ...
'[repstr_tpp]', '[amica_threads_s04]', ...
'[repstr_pca]', num2str(EEG.nbchan));
fidparam=fopen('[out_path]/[batch_dfn,_,-1]_A.param','w');
fprintf(fidparam,'%s',swapstr);
......@@ -204,7 +208,7 @@ swapstr=file_strswap('[amica_param_file]', ...
'[repstr_outpath]','[out_path]/[batch_dfn,_,-1]_amicaout_B', ...
'[repstr_nbchan]', num2str(EEG.nbchan), ...
'[repstr_pnts]', sprintf('%12.0f',EEG.pnts), ...
'[repstr_tpp]', '[amica_threads_s07_08_09]', ...
'[repstr_tpp]', '[amica_threads_s04]', ...
'[repstr_pca]', num2str(EEG.nbchan));
fidparam=fopen('[out_path]/[batch_dfn,_,-1]_B.param','w');
fprintf(fidparam,'%s',swapstr);
......@@ -217,7 +221,7 @@ swapstr=file_strswap('[amica_param_file]', ...
'[repstr_outpath]','[out_path]/[batch_dfn,_,-1]_amicaout_C', ...
'[repstr_nbchan]', num2str(EEG.nbchan), ...
'[repstr_pnts]', sprintf('%12.0f',EEG.pnts), ...
'[repstr_tpp]', '[amica_threads_s07_08_09]', ...
'[repstr_tpp]', '[amica_threads_s04]', ...
'[repstr_pca]', num2str(EEG.nbchan));
fidparam=fopen('[out_path]/[batch_dfn,_,-1]_C.param','w');
fprintf(fidparam,'%s',swapstr);
......
......@@ -5,22 +5,24 @@
%
%% From Config key_strswap Description
%-----------------------------------------------------------------------------------------------------------------------------
% in_path = [in_path] Relative path to input data files assuming cd = work_path
% out_path = [out_path] Relative path to output data files assuming cd = work_path
% in_path = [in_path] Relative path to input data files assuming cd = work_path
% recur_sec = [recur_sec] Recurrence (sec) for the current artifact detection epoching (e.g. 1)
% limit_sec = [limit_sec] Limits (sec) for the current artifact detection epoching (e.g. [0 1])
% epoch_z = [epoch_z] z threshold for flagging channel during icsd criteria (e.g. 2.326)
% epoch_p = [epoch_p] Percentage of flagged components required to flag an epoch during icsd criteria (e.g. .1)
% epoch_trim = [epoch_trim] Percentage trim for confidence intervals during channel neighbour r criteria (10 = 5% top and bottom)
% sd_t_meth = [sd_t_meth] Method used for flagging epochs (e.g. 'q' (quantiles), or 'na' (default))
% sd_t_vals = [sd_t_vals] Percentage trim for confidence intervals during epoch standard deviation criteria (e.g. [.3 .7])
% sd_t_o = [sd_t_o] z threshold for flagging epochs during standard deviation criteria (e.g. 6)
% sd_t_f_meth = [sd_t_f_meth] Fixed method used for flagging epochs (should be 'fixed')
% sd_t_f_vals = [sd_t_f_vals] Percentage trim for confidence intervals during epoch standard deviation criteria (e.g. [.3 .7], leave empty for 'fixed')
% sd_t_f_o = [sd_t_f_o] z threshold for flagging epochs during fixed standard deviation criteria (e.g. .2)
% min_gap_ms = [min_gap_ms] Minimum time (ms) to allow between periods marked for rejection
% icr_crit = [icr_crit] False discovery rate of component replicatablilty, measure of sensitivity %
% dip_vol = [dip_vol] file path/name of the standard volume file used in dipole fitting (e.g. derivatives/lossless/code/misc/standard_vol.mat).
% dip_mri = [dip_mri] file path/name of the standard mri file used in dipole fitting (e.g. derivatives/lossless/code/misc/standard_mri.mat).
% dip_elc = [dip_elc] file path/name of the standard electrode file used in dipole fitting (derivatives/lossless/code/misc/standard_1020.elc).
% dip_vol = [dip_vol] file path/name of the standard volume file used in dipole fitting (e.g. derivatives/lossless/code/misc/standard_vol.mat).
% dip_mri = [dip_mri] file path/name of the standard mri file used in dipole fitting (e.g. derivatives/lossless/code/misc/standard_mri.mat).
% dip_elc = [dip_elc] file path/name of the standard electrode file used in dipole fitting (derivatives/lossless/code/misc/standard_1020.elc).
% dip_transmat = [dip_transmat] Transformation matrix to apply during dipole fit (e.g. [0 0 0 0 0 0 1 1 1])
% cor_transmat = [cor_transmat] The transformation matrix to apply between dipole fitting to the standard head and performing ICLabel to the EEGLAB default orientation (e.g.[0,0,0,0,0,1.57,1,1,1])
% cor_nosedir = [cor_nosedir] Nose direction of montage to apply between dipole fitting to the standard head and performing ICLabel to the EEGLAB default orientation (e.g.+Y)
% cor_nosedir = [cor_nosedir] Nose direction of montage to apply between dipole fitting to the standard head and performing ICLabel to the EEGLAB default orientation (e.g. +Y)
% out_path = [out_path] Relative path to output data files assuming cd = work_path
%% LOAD COMPART DATASET
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
......@@ -43,7 +45,7 @@ EEG.amica(2).models=loadmodout15('[in_path]/[batch_dfn,_,-1]_amicaout_A');
EEG.icaweights=EEG.amica(2).models.W;
EEG.icasphere=EEG.amica(2).models.S(1:EEG.amica(2).models.num_pcs,:);
%% PASS EEGDATA THROUGH THE AMICA MATRIX
%% PASS EEG DATA THROUGH THE AMICA MATRIX
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Loads the B and C amica models. Amica A is used to fill in the ICA information.
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment