function main(model,task,subtask)
disp('RUN');
switch task 
    case 'pre'
        preprocess(model,subtask);
    case 'decode'
        decode(model,subtask);
    case 'plot'
        decode_plot(model,subtask);
end
end
% disp('all warnings OFF')
% warn = warning('off','all');


function preprocess(model,task)
% parse the GUI and pass parameters as structure

timeLine = getTimeLineParams(model);
subjects = getSubjectCellList(model);
classDef = parseClassDef(model);

mask     = ['^' cell2mat(getImageFileMask(model)) '.*\.img$'];

psthOpts = struct;
psthOpts.colBias       = getColumnBiasRemoveOption(model);
psthOpts.psthNorm      = getPsthNormalizationMethod(model);


switch task
    case 'COORD'
        disp('COORD');
       
        out = struct;
        out.header = struct;
        out.header.type = 'COORD';
        out.header.timeline = timeLine;
        out.header.classDef = classDef;
        
        coordargs = struct;
        coordargs.subjects      = subjects;
        coordargs.timeline      = timeLine;
        coordargs.basedir       = model.baseDir;
        coordargs.sessionList   = 1:3;
        coordargs.eventList     = classDef.eventMatrix;
        coordargs.coords        = parseCoordinateTextField(model);
        coordargs.mask          = mask;
        coordargs.radius        = getSearchlightRadius(model);
        coordargs.psthOpts      = psthOpts;

        
        out.subjectdata = runCoordTable(coordargs);
        
        assignin('base','preprocessedData',out);
        
    case 'ROI'
        disp('ROI');
        out = struct;
        out.header = struct;
        out.header.type = 'ROI';
        out.header.timeline = timeLine;
        out.header.classDef = classDef;
        
        roiargs = struct;
        roiargs.subjects        = subjects;
        roiargs.timeline        = timeLine;
        roiargs.classes         = classDef;
        roiargs.mask            = mask;
        roiargs.basedir         = model.baseDir;
        roiargs.sessionList     = 1:3;
        roiargs.eventList       = classDef.eventMatrix;
        roiargs.psthOpts        = psthOpts;
        
        out.subjectdata = runROIImageMaskMode(roiargs);
        
        assignin('base','preprocessedData',out);
        
    case 'FBS'
        disp('not implemented')
end
end

function decode(model,task)
preprocessedData = evalin('base','preprocessedData');

if(~(isa(preprocessedData,'struct')))
    display('you need to preprocess some data before this step');
    return
end

header            = preprocessedData.header;
header.frameShift = getFrameShiftParams(model);
data              = preprocessedData.subjectdata;

switch task
    case 'SVM'
        disp('SVM');
        svmopts    = getSvmArgs(model,1);
        header.svmrnd = getSvmRnd(model);
        decode = calculateMultiSubjectDecodePerformance(header,data,svmopts);
        decode.header = header;
        assignin('base','decode',decode);
    case 'XSVM'
        disp('XSVM')
        svmopts  = getSvmArgs(model,0);
        decode = xsvm_subject_loop(header,data,svmopts);
        decode.header = header;
        assignin('base','decode',decode);
    case 'SOM'
        display('SOM');
        somopts = '';
        decode = som_combined_subject_batch(header,data,somopts);
        decode.header = header;
        assignin('base','decode',decode);
    case 'X-SOM'
        disp('not implemented')
        
end

% disp('warings restored');
% warning('on',warn);
end

function decode_plot(model,type)
decode = evalin('base','decode');
preprocessed = evalin('base','preprocessedData');
plotDecodePerformance(type,decode,preprocessed.subjectdata);
       
end