function varargout=conn_process(options,varargin)

global CONN_x
if nargin<1, options=[]; end
if ischar(options),
    switch(lower(options)),
        case 'all',             disp(['CONN: RUNNING ALL ANALYSIS STEPS']); conn_process([0:14]); 
        case 'all_voxel',         disp(['CONN: RUNNING ALL ANALYSIS STEPS (voxel-based analyses only)']); conn_process([0:3,5:6,9:10,12:13]); 
        case 'all_roi',         disp(['CONN: RUNNING ALL ANALYSIS STEPS (roi-based analyses only)']); conn_process([0:2,4:5,7,9,11,14]); 
        case 'setup',           disp(['CONN: RUNNING SETUP STEP']); conn_process([0:5]);
        case 'setup_roi',       disp(['CONN: RUNNING SETUP STEP (roi-based analyses only)']); conn_process([0:2,4:5]);
        case 'preprocessing',   disp(['CONN: RUNNING PREPROCESSING STEP']); conn_process([5:9],varargin{:});
        case 'preprocessing_gui',disp(['CONN: RUNNING PREPROCESSING STEP']); conn_process([6:9],varargin{:});
        case 'preprocessing_roi',disp(['CONN: RUNNING PREPROCESSING STEP (roi-based analyses only)']); conn_process([5,7,9],varargin{:});
        case 'analyses',        disp(['CONN: RUNNING ANALYSIS STEP']); conn_process([9,10:14],varargin{:});
        case 'analyses_seed',   disp(['CONN: RUNNING ANALYSIS STEP (ROI-to-ROI or seed-to-voxel analyses)']); conn_process([9,10,12],varargin{:});
        case 'analyses_vv',     disp(['CONN: RUNNING ANALYSIS STEP (voxel-to-voxel analyses)']); conn_process([9,13],varargin{:});
        case 'analyses_roi',    disp(['CONN: RUNNING ANALYSIS STEP (roi-based analyses only)']); conn_process([9,11,14],varargin{:});
        case 'analyses_gui',    disp(['CONN: RUNNING ANALYSIS STEP']); conn_process([10:14],varargin{:});
        case 'analyses_gui_seed',disp(['CONN: RUNNING ANALYSIS STEP (ROI-to-ROI or seed-to-voxel analyses)']); conn_process([10:12,14],CONN_x.Analysis);
        case 'analyses_gui_vv', disp(['CONN: RUNNING ANALYSIS STEP (voxel-to-voxel analyses)']); conn_process([13],varargin{:});
        case 'prepare_results', conn_process(13:14,varargin{:});
        case 'prepare_results_roi',conn_process(14,varargin{:});
        case 'results',         conn_process(15:16,varargin{:});
        case 'results_voxel',   [varargout{1:nargout}]=conn_process(15,varargin{:});
        case 'results_roi',     [varargout{1:nargout}]=conn_process(16,varargin{:});
        case 'update',          conn gui_setup_saveas; conn_process all; conn save; 
    end
    return;
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Checks dimensionality of setup files
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if any(options==0),
    ERR={};
	if isempty(CONN_x.filename)||isempty(dir(CONN_x.filename)),ERR{end+1}=['WARNING: Project not saved or empty project information']; end
    try, conn_updatefilepaths; catch, ERR{end+1}=['ERROR: Files not found. Check that all your functional/structural/ROIs/first-level covariate files point to existing files.']; end
	nl1covariates=length(CONN_x.Setup.l1covariates.names)-1;
	nconditions=length(CONN_x.Setup.conditions.names)-1;
    nrois=length(CONN_x.Setup.rois.names)-1;
    if nconditions<1, ERR{end+1}=['ERROR: No conditions defined. You must define at least one condition (use onset=0; duration=inf; for encompassing the entire scanning session)']; end
	for nsub=1:CONN_x.Setup.nsubjects,
		nsess=CONN_x.Setup.nsessions(min(length(CONN_x.Setup.nsessions),nsub));
        if nsess<1,ERR{end+1}=['ERROR: Subject ',num2str(nsub),' has no functional data assigned (number of sessions = 0); increase the number of sessions in Setup->Basic or remove this subject']; end
        if numel(CONN_x.Setup.conditions.values)<nsub, ERR{end+1}=['ERROR: Subject ',num2str(nsub),' has no experimental conditions defined']; end
        if numel(CONN_x.Setup.conditions.values)>=nsub&&numel(CONN_x.Setup.conditions.values{nsub})<nconditions, ERR{end+1}=['ERROR: Missing experimental conditions on Subject ',num2str(nsub)]; end
        okconditions=false(1,nconditions);
		for nses=1:nsess,
            if length(CONN_x.Setup.nscans)<nsub, ERR{end+1}=['ERROR: Subject ',num2str(nsub),' has no functional data defined']; 
            elseif length(CONN_x.Setup.nscans{nsub})<nses, ERR{end+1}=['ERROR: Subject ',num2str(nsub),' has no functional data defined for session ',num2str(nses)]; 
            else,
                nscans=CONN_x.Setup.nscans{nsub}{nses};
                if isempty(nscans),ERR{end+1}=['ERROR: Subject ',num2str(nsub),' Session ',num2str(nses), ' functional data has not been defined']; 
                elseif nscans<2, ERR{end+1}=['ERROR: Subject ',num2str(nsub),' Session ',num2str(nses), ' functional data has ',num2str(nscans),' time-points (scans) defined']; end
                for nroi=1:nrois,
                    if numel(CONN_x.Setup.rois.files)<nsub||numel(CONN_x.Setup.rois.files{nsub})<nroi||numel(CONN_x.Setup.rois.files{nsub}{nroi})<3||isempty(CONN_x.Setup.rois.files{nsub}{nroi}{1}),
                        ERR{end+1}=['ERROR: Subject ',num2str(nsub),' ROI ',num2str(nroi), ' file has not been defined']; 
                    end
                end
                for nl1covariate=1:nl1covariates,
                    filename=CONN_x.Setup.l1covariates.files{nsub}{nl1covariate}{nses}{1};
                    switch(filename),
                        case '[raw values]',
                            data=CONN_x.Setup.l1covariates.files{nsub}{nl1covariate}{nses}{3};
                        otherwise,
                            data=load(filename);
                            if isstruct(data), tempnames=fieldnames(data); data=data.(tempnames{1}); end
                    end
                    names=CONN_x.Setup.l1covariates.names{nl1covariate};
                    if size(data,1)~=nscans, ERR{end+1}=['ERROR: Subject ',num2str(nsub),' Session ',num2str(nses), ' first-level covariate ',names,' mismatched dimensions (',num2str(size(data,1)),' rows, while functional data has ',num2str(nscans),' scans; the number of rows of a first-level covariate should equal the number of scans for this subject/session)']; end
                end
                for ncondition=1:nconditions,
                    if numel(CONN_x.Setup.conditions.values)>=nsub&&numel(CONN_x.Setup.conditions.values{nsub})>=ncondition&&(numel(CONN_x.Setup.conditions.values{nsub}{ncondition})<nses||numel(CONN_x.Setup.conditions.values{nsub}{ncondition}{nses})<2), 
                        disp(['warning: Subject ',num2str(nsub),' condition ',CONN_x.Setup.conditions.names{ncondition},' has not been defined for session ',num2str(nses),'. Assuming this condition is not present in this session']);
                        CONN_x.Setup.conditions.values{nsub}{ncondition}{nses}={[],[]};
                    else
                        okconditions(ncondition)=okconditions(ncondition)|(~isempty(CONN_x.Setup.conditions.values{nsub}{ncondition}{nses}{1})&&~isempty(CONN_x.Setup.conditions.values{nsub}{ncondition}{nses}{2}));
                    end
                end
            end
        end
        if any(~okconditions)
            for ncondition=find(~okconditions);
                ERR{end+1}=['ERROR: Subject ',num2str(nsub),' does not have any scan associated with condition ',CONN_x.Setup.conditions.names{ncondition}];
            end
        end
    end
    if ~isempty(ERR), 
        disp('SOME ERROR FOUNDS!: Please revise the Setup information');
        disp(strvcat(ERR));
        return;
    end
    % check coregistration of reference files
    CONN_x.Setup.normalized=1;
    if CONN_x.Setup.spatialresolution~=1
        ok=1;
        for nsub=1:CONN_x.Setup.nsubjects,
            switch(CONN_x.Setup.spatialresolution)
                case 2, v=CONN_x.Setup.structural{nsub}{3}.dim;
                case 3, v=CONN_x.Setup.functional{nsub}{1}{3}.dim;
            end
            if nsub==1, vref=v;
            elseif any(v~=vref), ok=0; 
            end
        end
        if ~ok,
            switch(CONN_x.Setup.spatialresolution)
                case 2, vname='structural';
                case 3, vname='functional';
            end
            txt=sprintf('Warning: %s volumes do not have the same dimensions. Multi-subject voxel-level analyses will NOT be performed. Choose ''same as template'' option in ''spatial resolution'' field if you wish to resample the data to a common voxel-resolution instead',vname);
            if isfield(CONN_x,'gui')&&isnumeric(CONN_x.gui)&&CONN_x.gui, 
                  answ= questdlg(txt,'','Continue', 'Stop','Stop');
                  if strcmp(answ,'Stop'), return; end
                  CONN_x.Setup.normalized=0;
            else
                disp(txt);
                CONN_x.Setup.normalized=0;
            end
        end
    end
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Segments structural data if appropriate
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if any(options==1),
	h=conn_waitbar(0,['Step ',num2str(sum(options<=1)),'/',num2str(length(options)),': Segmentation']);
	[path,name,ext]=fileparts(CONN_x.filename);
	for nsub=1:CONN_x.Setup.nsubjects,
		nsess=CONN_x.Setup.nsessions(min(length(CONN_x.Setup.nsessions),nsub));
        dosegm=0;for n1=1:3,if length(CONN_x.Setup.rois.files{nsub})<n1||isempty(CONN_x.Setup.rois.files{nsub}{n1})||~iscell(CONN_x.Setup.rois.files{nsub}{n1})||isempty(CONN_x.Setup.rois.files{nsub}{n1}{1}),dosegm=1;end;end;
        if dosegm,
            file=deblank(CONN_x.Setup.structural{nsub}{1});
            if (~conn_existfile(conn_prepend(['c',num2str(1)],file)))||(~conn_existfile(conn_prepend(['c',num2str(2)],file)))||(~conn_existfile(conn_prepend(['c',num2str(3)],file))),
                V=spm_vol(file);
                res=spm_preproc(V);
                [sn,isn]=spm_prep2sn(res);
                savefields(conn_prepend('',deblank(CONN_x.Setup.structural{nsub}{1}),'_seg_sn.mat'),sn);
                savefields(conn_prepend('',deblank(CONN_x.Setup.structural{nsub}{1}),'_seg_inv_sn.mat'),isn);
                opts=struct('biascor',0,'GM',[0 0 1],'WM',[0 0 1],'CSF',[0 0 1],'cleanup',0);
                spm_preproc_write(sn,opts);
            end
			for n1=1:3,
				ffile=conn_prepend(['c',num2str(n1)],file);
				[V,str,icon]=conn_getinfo(ffile);
				CONN_x.Setup.rois.files{nsub}{n1}={ffile,str,icon};
			end
		end
		conn_waitbar(nsub/CONN_x.Setup.nsubjects,h);
	end
	conn_waitbar('close',h);
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creates COV_Subject###_Session###.mat files (first-level temporal covariate values)
% Creates COND_Subject###_Session###.mat files (temporal samples included in each condition)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if any(options==2),
	[path,name,ext]=fileparts(CONN_x.filename);
	%[ok,nill]=mkdir(path,name);
	%[ok,nill]=mkdir(fullfile(path,name),'data');
	%filepath=fullfile(path,name,'data');
    filepath=CONN_x.folders.data;
	h=conn_waitbar(0,['Step ',num2str(sum(options<=2)),'/',num2str(length(options)),': Importing covariates']);
    REDO=[];
	nl1covariates=length(CONN_x.Setup.l1covariates.names)-1;
	nconditions=length(CONN_x.Setup.conditions.names)-1;
	N=sum(CONN_x.Setup.nsessions); if length(CONN_x.Setup.nsessions)==1, N=N*CONN_x.Setup.nsubjects; end
	N=N*(nl1covariates+nconditions);
    maxdims=[];n=0;
	for nsub=1:CONN_x.Setup.nsubjects,
		nsess=CONN_x.Setup.nsessions(min(length(CONN_x.Setup.nsessions),nsub));
		for nses=1:nsess,
            filename=fullfile(filepath,['COND_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'.mat']);
            if isempty(REDO)&&~isempty(dir(filename)),
                if isfield(CONN_x,'gui')&&isstruct(CONN_x.gui)&&isfield(CONN_x.gui,'overwrite'), REDO=CONN_x.gui.overwrite; else, REDO=questdlg('Overwrite existing subject results?','','Yes', 'No', 'Yes');end;
            end
            if strcmp(REDO,'Yes')||isempty(dir(filename)),
                clear data names;
                clear samples weights;
                nscans=CONN_x.Setup.nscans;
                for nl1covariate=1:nl1covariates,
                    filename=CONN_x.Setup.l1covariates.files{nsub}{nl1covariate}{nses}{1};
                    switch(filename),
                        case '[raw values]',
                            data{nl1covariate}=CONN_x.Setup.l1covariates.files{nsub}{nl1covariate}{nses}{3};
                        otherwise,
                            data{nl1covariate}=load(filename);
                            if isstruct(data{nl1covariate}), tempnames=fieldnames(data{nl1covariate}); data{nl1covariate}=data{nl1covariate}.(tempnames{1}); end
                    end
                    names{nl1covariate}=CONN_x.Setup.l1covariates.names{nl1covariate};
                    n=n+1;
                    conn_waitbar(n/N,h);
                end
                for ncondition=1:nconditions,
                    onset=CONN_x.Setup.conditions.values{nsub}{ncondition}{nses}{1};
                    durat=CONN_x.Setup.conditions.values{nsub}{ncondition}{nses}{2};
                    rt=CONN_x.Setup.RT/10;
                    durat=max(rt,min(CONN_x.Setup.RT*CONN_x.Setup.nscans{nsub}{nsess},durat));
                    hrf=spm_hrf(rt);
                    x=zeros(ceil(CONN_x.Setup.nscans{nsub}{nses}*CONN_x.Setup.RT/rt),1);
                    for n1=1:length(onset), x(round(1+onset(n1)/rt+(0:durat(min(length(durat),n1))/rt-1)))=1; end
                    if CONN_x.Setup.acquisitiontype==1,
                        x=convn(x,hrf);
                    end
                    x=mean(reshape(x(1:10*CONN_x.Setup.nscans{nsub}{nses}),[10,CONN_x.Setup.nscans{nsub}{nses}]),1)';%x=x(1+10*(0:CONN_x.Setup.nscans{nsub}{nses}-1));
                    data{nl1covariates+ncondition}=x;
                    names{nl1covariates+ncondition}=['Effect of ',CONN_x.Setup.conditions.names{ncondition}];
                    
                    samples{ncondition}=[]; weights{ncondition}=cell(1,2);
                    idx1=find(x>0); idx2=[0;find(diff(idx1)>1);length(idx1)];
                    for n1=1:length(idx2)-1,
                        idx=idx1(idx2(n1)+1:idx2(n1+1));
                        samples{ncondition}=cat(1,samples{ncondition},idx(:));
                        weights{ncondition}{1}=cat(1,weights{ncondition}{1},x(idx(:)));
                        weights{ncondition}{2}=cat(1,weights{ncondition}{2},conn_hanning(length(idx)));
                    end
                    n=n+1;
                    conn_waitbar(n/N,h);
                end
                filename=fullfile(filepath,['COV_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'.mat']);
                save(filename,'data','names');
                % 			if str2num(version('-release'))>=14, save(filename,'-V6','data','names');
                % 			else, save(filename,'data','names'); end
                for n1=1:length(data), if length(maxdims)<n1, maxdims(n1)=size(data{n1},2); else, maxdims(n1)=max(maxdims(n1),size(data{n1},2)); end; end
                names={CONN_x.Setup.conditions.names{1:nconditions}};
                filename=fullfile(filepath,['COND_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'.mat']);
                save(filename,'samples','weights','names');
                % 			if str2num(version('-release'))>=14, save(filename,'-V6','samples','weights','names');
                % 			else, save(filename,'samples','weights','names'); end
            end
		end
	end
	conn_waitbar('close',h);
end
    
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creates DATA_Subject###_Session###.mat files (percentage signal change data at analysis mask)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if any(options==3) && any(CONN_x.Setup.steps([2,3])),
	[path,name,ext]=fileparts(CONN_x.filename);
    filepath=CONN_x.folders.data;
	h=conn_waitbar(0,['Step ',num2str(sum(options<=3)),'/',num2str(length(options)),': Importing functional data']);
    REDO='Yes';filename=fullfile(filepath,['DATA_Subject',num2str(1,'%03d'),'_Session',num2str(1,'%03d'),'.mat']);
    if ~isempty(dir(filename)),if isfield(CONN_x,'gui')&&isstruct(CONN_x.gui)&&isfield(CONN_x.gui,'overwrite'), REDO=CONN_x.gui.overwrite; else, REDO=questdlg('Overwrite existing subject results?','','Yes', 'No', 'Yes');end; end
	N=sum(CONN_x.Setup.nsessions); if length(CONN_x.Setup.nsessions)==1, N=N*CONN_x.Setup.nsubjects; end
	n=0;
    if CONN_x.Setup.analysismask==1,%CONN_x.Setup.normalized,
        filename=fullfile(fileparts(which('spm')),'apriori','brainmask.nii');
        Vmask=spm_vol(filename);
    elseif 0,%isfield(CONN_x.Setup,'usebrainmask')&&CONN_x.Setup.usebrainmask,
                Vmask1=spm_vol(CONN_x.Setup.rois.files{nsub}{1}{1});
                Vmask2=spm_vol(CONN_x.Setup.rois.files{nsub}{2}{1});
                Vmask3=spm_vol(CONN_x.Setup.rois.files{nsub}{3}{1});
                Vmask=struct('mat',Vmask1.mat,'dim',Vmask1.dim,'fname',conn_prepend('mask_',CONN_x.Setup.functional{nsub}{1}{1}(1,:)),...
                    'dt',[spm_type('uint8') spm_platform('bigend')]);
                a=spm_read_vols(Vmask1)+spm_read_vols(Vmask2)+spm_read_vols(Vmask3);
                    try,
                    spm_write_vol(Vmask,a>0);
                    catch,
                        [temp_path,temp_filename,temp_ext]=fileparts(Vmask.fname);
                        Vmask.fname=fullfile(pwd,[temp_filename,temp_ext]);
                        spm_write_vol(Vmask,a>0);
                    end
                Vmask=spm_vol(Vmask.fname);
    else, Vmask=[]; end
	for nsub=1:CONN_x.Setup.nsubjects,
        switch CONN_x.Setup.spatialresolution
            case 1, filename=fullfile(fileparts(which('spm')),'apriori','brainmask.nii');
            case 2, filename=deblank(CONN_x.Setup.structural{nsub}{1});
            case 3, filename=deblank(CONN_x.Setup.functional{nsub}{1}{1}(1,:));
        end
        Vref=spm_vol(filename);
        Vref=Vref(1);
        CONN_x.Setup.spatialresolutionvolume{nsub}=Vref;

%         if ~CONN_x.Setup.normalized,
%             filename=deblank(CONN_x.Setup.structural{nsub}{1});
%             Vref=spm_vol(filename);
%         end
		nsess=CONN_x.Setup.nsessions(min(length(CONN_x.Setup.nsessions),nsub));
		sfile=[];%conn_prepend('',CONN_x.Setup.structural{nsub}{1},'_seg_inv_sn.mat');
		for nses=1:nsess,
			filename=fullfile(filepath,['DATA_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'.mat']);
            if strcmp(REDO,'Yes')||isempty(dir(filename)),
                warning off;Vsource=spm_vol(CONN_x.Setup.functional{nsub}{nses}{1});warning on;
                CONN_x.Setup.nscans{nsub}{nses}=prod(size(Vsource));
                if CONN_x.Setup.analysismask==2&&nses==1,%~CONN_x.Setup.normalized&&(isempty(Vmask)), % computes analysis mask
                    Vmask=Vsource(1);
                    Vmask.fname=conn_prepend('mask_',CONN_x.Setup.functional{nsub}{1}{1}(1,:));
                    Vmask.dt=[spm_type('uint8') spm_platform('bigend')];
                    a=ones(Vmask.dim(1:3));
                    [gridx,gridy,gridz]=ndgrid(1:Vmask.dim(1),1:Vmask.dim(2),1:Vmask.dim(3));xyz=Vmask.mat*[gridx(:),gridy(:),gridz(:),ones(numel(gridx),1)]';
                    for nsest=1:nsess,
                        if nsest==nses,Vsourcet=Vsource;else,warning off;Vsourcet=spm_vol(CONN_x.Setup.functional{nsub}{nsest}{1});warning on;end
                        for nt=1:numel(Vsourcet),
                            b=reshape(spm_get_data(Vsourcet(nt),pinv(Vsourcet(nt).mat)*xyz),Vmask.dim(1:3)); %b=spm_read_vols(Vsourcet(nt));
                            mb=mean(b(b>mean(b(~isnan(b)))/8));
                            a=a&(b>0.80*mb);
                        end
                    end
                    try,
                    spm_write_vol(Vmask,a);
                    catch,
                        [temp_path,temp_filename,temp_ext]=fileparts(Vmask.fname);
                        Vmask.fname=fullfile(pwd,[temp_filename,temp_ext]);
                        spm_write_vol(Vmask,a);
                    end
                end
                V=conn_create_vol(filename,Vsource,[],Vref,sfile,Vmask);
            end
			n=n+1;
			conn_waitbar(n/N,h);
		end
	end
	conn_waitbar('close',h);
	clear data;
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creates sDATA_Subject###_Session###.mat files (smoothed functional data)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if 0,%any(options==2.5),
	[path,name,ext]=fileparts(CONN_x.filename);
    filepath=CONN_x.folders.data;
	h=conn_waitbar(0,['Step ',num2str(sum(options<=3)),'/',num2str(length(options)),': Smoothing functional data']);
	N=sum(CONN_x.Setup.nsessions); if length(CONN_x.Setup.nsessions)==1, N=N*CONN_x.Setup.nsubjects; end
	n=0;
	for nsub=1:CONN_x.Setup.nsubjects,
		[spath,sfile,sext]=fileparts(deblank(CONN_x.Setup.structural{nsub}{1}));
		nsess=CONN_x.Setup.nsessions(min(length(CONN_x.Setup.nsessions),nsub));
		for nses=1:nsess,
			filename=fullfile(filepath,['DATA_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'.mat']);
			fileout=fullfile(filepath,['sDATA_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'.mat']);
			Y0=conn_vol(filename);
			conn_reslice(fileout,Y0.matdim.mat,Y0.matdim.dim,Y0,[],CONN_x.Setup.fwhm);
			n=n+1;
			conn_waitbar(n/N,h);
		end
	end
	conn_waitbar('close',h); ;
	clear data;
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creates ROI_Subject###_Session###.mat files (activation timecourses for each roi)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if any(options==4),
	[path,name,ext]=fileparts(CONN_x.filename);
    filepath=CONN_x.folders.data;
	h=conn_waitbar(0,['Step ',num2str(sum(options<=4)),'/',num2str(length(options)),': Importing ROI data']);
    REDO='Yes';filename=fullfile(filepath,['ROI_Subject',num2str(1,'%03d'),'_Session',num2str(1,'%03d'),'.mat']);
    if ~isempty(dir(filename)),if isfield(CONN_x,'gui')&&isstruct(CONN_x.gui)&&isfield(CONN_x.gui,'overwrite'), REDO=CONN_x.gui.overwrite; else, REDO=questdlg('Overwrite existing subject results?','','Yes', 'No', 'Yes');end; end
	nrois=length(CONN_x.Setup.rois.names)-1;
	N=sum(CONN_x.Setup.nsessions); if length(CONN_x.Setup.nsessions)==1, N=N*CONN_x.Setup.nsubjects; end
	N=N*nrois;
	n=0;
	for nsub=1:CONN_x.Setup.nsubjects,
        clear Vmask; for nroi=1:nrois, Vmask{nroi}=CONN_x.Setup.rois.files{nsub}{nroi}{1}; end
        ERODE=1; % erosing level for white/csf masks (voxels) (set to 0 for no erosion)
        if ERODE>0,
            for nroi=2:3,
                Vmask{nroi}=conn_prepend('e',CONN_x.Setup.rois.files{nsub}{nroi}{1});
                if (~conn_existfile(conn_prepend('e',CONN_x.Setup.rois.files{nsub}{nroi}{1}))),
                    [nill,nill,ext]=fileparts(Vmask{nroi});
                    switch(ext),
                        case {'.img','.nii','.hdr'},
                            V0=spm_vol(CONN_x.Setup.rois.files{nsub}{nroi}{1}); % mask
                            X0=spm_read_vols(V0);
                            idx1=find(X0(:)>.5);
                            [idxx,idxy,idxz]=ind2sub(size(X0),idx1);
                            idxt=find(idxx>ERODE&idxx<size(X0,1)+1-ERODE&idxy>ERODE&idxy<size(X0,2)+1-ERODE&idxz>ERODE&idxz<size(X0,3)+1-ERODE);
                            for n1=1:length(idxt), if (sum(sum(sum(X0(idxx(idxt(n1))+(-ERODE:ERODE),idxy(idxt(n1))+(-ERODE:ERODE),idxz(idxt(n1))+(-ERODE:ERODE))<.5,3),2),1))>1, idxt(n1)=0; end; end
                            idxt=idxt(idxt>0);
                            idx1=idx1(idxt);
                            X1=zeros(size(X0));X1(idx1)=1;V0.fname=conn_prepend('e',CONN_x.Setup.rois.files{nsub}{nroi}{1});spm_write_vol(V0,X1);
                        otherwise,
                            Vmask{nroi}=CONN_x.Setup.rois.files{nsub}{nroi}{1};
                    end
                end
            end
        end
        
		nsess=CONN_x.Setup.nsessions(min(length(CONN_x.Setup.nsessions),nsub));
		for nses=1:nsess,
			filename=fullfile(filepath,['ROI_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'.mat']);
            if ~isempty(dir(filename)),
                old=load(filename);%,'data','names','source','xyz','sampledata');
            else, old=[]; end
            
            filename=fullfile(filepath,['COV_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'.mat']);
            covariates=load(filename);covariates=cat(2,covariates.data{:});
            source=fullfile(filepath,['DATA_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'.mat']);
            Vsource=CONN_x.Setup.functional{nsub}{nses}{1};
            Vsource2=[];
            for n1=1:size(Vsource,1),
                [Vsourcepath,Vsourcename,Vsourceext]=fileparts(Vsource(n1,:));
                if Vsourcename(1)~='s' || (~conn_existfile(fullfile(Vsourcepath,[Vsourcename(2:end),Vsourceext]))), Vsource2=[]; break; end
                Vsource2=strvcat(Vsource2,fullfile(Vsourcepath,[Vsourcename(2:end),Vsourceext])); % exists un-smooth data?
            end
            if strcmp(REDO,'Yes')||isempty(old)||~isfield(old,'sampledata'),
                sampledata=conn_rex(Vsource,Vmask{1},'dims',256,'level','subsetvoxels','scaling','roi','select_clusters',0,'output_type','none');
            else, sampledata=old.sampledata; end
            if ~isempty(Vsource2), Vsource=Vsource2; end
            clear data names xyz;
            nroi1=1;
            for nroi=1:nrois,
                %if nroi>=5&&nroi<=8,REDO='Yes';else REDO='No'; end
                if ~isfield(CONN_x.Setup.rois,'mask') || length(CONN_x.Setup.rois.mask)<nroi, CONN_x.Setup.rois.mask(nroi)=0; end
                if ~isfield(CONN_x.Setup.rois,'multiplelabels') || length(CONN_x.Setup.rois.multiplelabels)<nroi, CONN_x.Setup.rois.multiplelabels(nroi)=0; end
                if ~isfield(CONN_x.Setup.rois,'regresscovariates') || length(CONN_x.Setup.rois.regresscovariates)<nroi, CONN_x.Setup.rois.regresscovariates(nroi)=double(CONN_x.Setup.rois.dimensions{nrois}>1); end
                
                failed=0;
                if ~strcmp(REDO,'Yes')&&~isempty(old),
                    if CONN_x.Setup.rois.multiplelabels(nroi), 
                        [roi_path_dir,roi_path_name]=fileparts(Vmask{nroi});
                        idx=strmatch([CONN_x.Setup.rois.names{nroi},'.'],old.names);
                        %idx=strmatch([roi_path_name,'.'],old.names);
                        if isempty(idx) failed=1;
                        else
                            if isempty(dir(fullfile(roi_path_dir,[roi_path_name,'.txt']))),
                                if CONN_x.Setup.rois.mask(nroi), mask=CONN_x.Setup.rois.files{nsub}{1}{1}; else, mask=''; end
                                if CONN_x.Setup.rois.multiplelabels(nroi), level='clusters'; else, level='rois'; end
                                if CONN_x.Setup.rois.regresscovariates(nroi), entercovariates=covariates; else, entercovariates=[]; end
                                [nill,tnames]=conn_rex(Vmask{nroi},Vmask{nroi},'summary_measure','mean','conjunction_mask',mask,'level',level,'scaling','roi','select_clusters',0,'covariates',entercovariates,'output_type','saverex');
                                for n1=1:numel(tnames)
                                    if ~isempty(strmatch(roi_path_name,tnames{n1})), tnames{n1}=[tnames{n1}(numel(roi_path_name)+2:end)]; end
                                end
                            else
                                tnames=textread(fullfile(roi_path_dir,[roi_path_name,'.txt']),'%s','delimiter','\n');
                            end
                            clear tidx; for n1=1:length(tnames),
                                tidx{n1}=strmatch([CONN_x.Setup.rois.names{nroi},'.',tnames{n1}],old.names,'exact');
                                if isempty(tidx{n1}), failed=1; else, tidx{n1}=tidx{n1}(1); end
                            end
                            if ~failed,
                                for n1=1:length(tnames),
                                    data{nroi1}=old.data{tidx{n1}};
                                    names{nroi1}=old.names{tidx{n1}};
                                    xyz{nroi1}=old.xyz{tidx{n1}};
                                    nroi1=nroi1+1;
                                end
                            end
                        end
                    else,
                        idx=strmatch(CONN_x.Setup.rois.names{nroi},old.names,'exact');
                        if isempty(idx), failed=1;
                        else, 
                            idx=idx(1);
                            data{nroi1}=old.data{idx};
                            names{nroi1}=old.names{idx};
                            xyz{nroi1}=old.xyz{idx};
                            nroi1=nroi1+1;
                        end
                    end
                end
                if strcmp(REDO,'Yes')||isempty(old)||failed,
                    %disp(nroi);
                    if CONN_x.Setup.rois.mask(nroi), mask=CONN_x.Setup.rois.files{nsub}{1}{1}; else, mask=''; end
                    if CONN_x.Setup.rois.multiplelabels(nroi), level='clusters'; else, level='rois'; end
                    if CONN_x.Setup.rois.regresscovariates(nroi), entercovariates=covariates; else, entercovariates=[]; end
                    if isfield(CONN_x.Setup,'extractSVD')&&CONN_x.Setup.extractSVD
                        [data{nroi1},namesroi{nroi},params]=conn_rex(Vsource,Vmask{nroi},'summary_measure','eigenvariate','PCA',0,'dims',CONN_x.Setup.rois.dimensions{nroi},'conjunction_mask',mask,'level',level,'scaling','roi','select_clusters',0,'covariates',entercovariates,'output_type','saverex');
                    else
                        if CONN_x.Setup.rois.dimensions{nroi}>1,
                            [data{nroi1},namesroi{nroi},params]=conn_rex(Vsource,Vmask{nroi},'summary_measure','eigenvariate','dims',CONN_x.Setup.rois.dimensions{nroi},'conjunction_mask',mask,'level',level,'scaling','roi','select_clusters',0,'covariates',entercovariates,'output_type','saverex');
                        else,
                            [data{nroi1},namesroi{nroi},params]=conn_rex(Vsource,Vmask{nroi},'summary_measure','mean','conjunction_mask',mask,'level',level,'scaling','roi','select_clusters',0,'covariates',entercovariates,'output_type','saverex');
                        end
                    end
                    [data{nroi1},ok]=conn_nan(data{nroi1});
                    data{nroi1}=detrend(data{nroi1},'constant');
                    if CONN_x.Setup.rois.multiplelabels(nroi),
                        datatemp=data{nroi1};
                        [Vmaskfilepath,Vmaskfilename,Vmaskfileext]=fileparts(Vmask{nroi});
                        for n1=1:size(datatemp,2),
                            data{nroi1}=datatemp(:,n1); names{nroi1}=namesroi{nroi}{n1};
                            if ~isempty(strmatch(Vmaskfilename,names{nroi1})), names{nroi1}=[CONN_x.Setup.rois.names{nroi},names{nroi1}(numel(Vmaskfilename)+1:end)]; end
                            Z=params.ROIinfo.basis{params.ROIinfo.trans{n1}{1}}{params.ROIinfo.trans{n1}{2}}(params.ROIinfo.trans{n1}{4},params.ROIinfo.trans{n1}{3});
                            XYZ=params.ROIinfo.voxels{params.ROIinfo.trans{n1}{1}}{params.ROIinfo.trans{n1}{2}}(params.ROIinfo.trans{n1}{4},:);
                            xyz{nroi1}=mean(XYZ(Z==max(Z),:),1);
                            nroi1=nroi1+1;
                        end
                    else,
                        names{nroi1}=CONN_x.Setup.rois.names{nroi};
                        n1=1;
                        Z=params.ROIinfo.basis{params.ROIinfo.trans{n1}{1}}{params.ROIinfo.trans{n1}{2}}(params.ROIinfo.trans{n1}{4},params.ROIinfo.trans{n1}{3});
                        XYZ=params.ROIinfo.voxels{params.ROIinfo.trans{n1}{1}}{params.ROIinfo.trans{n1}{2}}(params.ROIinfo.trans{n1}{4},:);
                        xyz{nroi1}=mean(XYZ(Z==max(Z),:),1);
                        nroi1=nroi1+1;
                    end
                    filename=fullfile(filepath,['REX_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'_ROI',num2str(nroi),'.mat']);
                    load('REX.mat');save(filename,'params');
                end
                
                n=n+1;
                conn_waitbar(n/N,h);
            end
            filename=fullfile(filepath,['ROI_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'.mat']);
            save(filename,'data','names','source','xyz','sampledata');
%             if str2num(version('-release'))>=14, save(filename,'-V6','data','names','source','xyz','sampledata');
%             else, save(filename,'data','names','source','xyz','sampledata');end
		end
    end
    % eliminates ROIs not present in all subjects/sessions
	for nsub=1:CONN_x.Setup.nsubjects,
		nsess=CONN_x.Setup.nsessions(min(length(CONN_x.Setup.nsessions),nsub));
		for nses=1:nsess,
			filename=fullfile(filepath,['ROI_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'.mat']);
            load(filename,'names');
            if nsub==1&&nses==1,ROInamesall=names;
            else,
                temp=zeros(1,length(ROInamesall));
                for n1=1:length(ROInamesall),
                    idx=strmatch(ROInamesall{n1},names,'exact');
                    temp(n1)=~isempty(idx);
                end
                if ~all(temp),
                    idx=find(~temp);
                    for n1=1:length(idx), disp(['Warning: ROI ',ROInamesall{idx(n1)},' missing from Subject ',num2str(nsub),' Session ',num2str(nses)]); end
                end
                ROInamesall={ROInamesall{find(temp)}};
            end
        end
    end
    tmp=[];
	for nsub=1:CONN_x.Setup.nsubjects,
		nsess=CONN_x.Setup.nsessions(min(length(CONN_x.Setup.nsessions),nsub));
		for nses=1:nsess,
			filename=fullfile(filepath,['ROI_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'.mat']);
            load(filename,'data','names','source','xyz','sampledata');
            temp=zeros(1,length(names));
            for n1=1:length(names),
                idx=strmatch(names{n1},ROInamesall,'exact');
                temp(n1)=~isempty(idx);
            end
            if ~all(temp),
                if isempty(tmp), tmp=questdlg('Remove regions with incomplete data?','','Yes', 'No', 'Yes'); end
                if strcmp(tmp,'Yes'),
                    data={data{find(temp)}};
                    names={names{find(temp)}};
                    xyz={xyz{find(temp)}};
                    save(filename,'data','names','source','xyz','sampledata');
%                     if str2num(version('-release'))>=14, save(filename,'-V6','data','names','source','xyz','sampledata');
%                     else, save(filename,'data','names','source','xyz','sampledata');end
                end
            end
        end
    end
	conn_waitbar('close',h); ;
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% updates CONN_x.Preproc structure with a subset of ROIs plus all covariates
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if any(options==5),
	[path,name,ext]=fileparts(CONN_x.filename);
    filepath=CONN_x.folders.data;
	filename1=fullfile(filepath,['ROI_Subject',num2str(1,'%03d'),'_Session',num2str(1,'%03d'),'.mat']);
	filename2=fullfile(filepath,['COV_Subject',num2str(1,'%03d'),'_Session',num2str(1,'%03d'),'.mat']);
    if isempty(dir(filename1)), disp(['Not ready to process step conn_process_5']); return; end
	x1=load(filename1);
	x2=load(filename2);
	CONN_x.Preproc.variables.names=cat(2,x1.names,x2.names);
	CONN_x.Preproc.variables.types=cat(2,repmat({'roi'},[1,length(x1.names)]),repmat({'cov'},[1,length(x2.names)]));
	CONN_x.Preproc.variables.deriv=cat(2,repmat({0},[1,length(x1.names)]),repmat({1},[1,length(x2.names)]));
	CONN_x.Preproc.variables.dimensions={};
	for n1=1:length(x1.names), CONN_x.Preproc.variables.dimensions{end+1}=size(x1.data{n1},2)*ones(1,2); end
	for n1=1:length(x2.names), CONN_x.Preproc.variables.dimensions{end+1}=size(x2.data{n1},2)*ones(1,2); end
    N1=length(x1.names);N2=length(x2.names);
	for nsub=1:CONN_x.Setup.nsubjects,
		nsess=CONN_x.Setup.nsessions(min(length(CONN_x.Setup.nsessions),nsub));
		for nses=1:nsess,
            filename2=fullfile(filepath,['COV_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'.mat']);
            x2=load(filename2);
            for n1=1:N2, CONN_x.Preproc.variables.dimensions{N1+n1}=max(CONN_x.Preproc.variables.dimensions{N1+n1},size(x2.data{n1},2)*ones(1,2)); end
        end
    end
	
    if isfield(CONN_x.Preproc.confounds,'names') && ~isempty(CONN_x.Preproc.confounds.names), initial=CONN_x.Preproc.confounds.names; dims=CONN_x.Preproc.confounds.dimensions; ders=CONN_x.Preproc.confounds.deriv; 
    else, initial={'White Matter','CSF',x2.names{:}};dims={5,5}; ders={}; end
	CONN_x.Preproc.confounds.names={};
	CONN_x.Preproc.confounds.types={};
	CONN_x.Preproc.confounds.deriv={};
	CONN_x.Preproc.confounds.dimensions={};
	for n1=1:length(initial), idx=strmatch(initial{n1},CONN_x.Preproc.variables.names,'exact'); if ~isempty(idx),
			CONN_x.Preproc.confounds.names{end+1}=CONN_x.Preproc.variables.names{idx};
			CONN_x.Preproc.confounds.types{end+1}=CONN_x.Preproc.variables.types{idx};
			if length(ders)>=n1&&~isempty(ders{n1}), CONN_x.Preproc.confounds.deriv{end+1}=ders{n1}; else, CONN_x.Preproc.confounds.deriv{end+1}=CONN_x.Preproc.variables.deriv{idx};end
			if length(dims)>=n1&&~isempty(dims{n1}), CONN_x.Preproc.confounds.dimensions{end+1}=[min(dims{n1}(1),CONN_x.Preproc.variables.dimensions{idx}(1)),CONN_x.Preproc.variables.dimensions{idx}(1)]; else, CONN_x.Preproc.confounds.dimensions{end+1}=CONN_x.Preproc.variables.dimensions{idx}; end
		end
	end
	if ~isfield(CONN_x.Preproc,'filter')||isempty(CONN_x.Preproc.filter), CONN_x.Preproc.filter=[0,1/(2*CONN_x.Setup.RT)]; end
end



%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creates DATA_Subject###_Condition###.mat files (whole-brain data after removal of confounding effects & filtering)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if any(options==6) && any(CONN_x.Setup.steps([2,3])),
	[path,name,ext]=fileparts(CONN_x.filename);
    filepath=CONN_x.folders.data;
	filepathresults=CONN_x.folders.preprocessing;
	nconditions=length(CONN_x.Setup.conditions.names)-1;
	h=conn_waitbar(0,['Step ',num2str(sum(options<=6)),'/',num2str(length(options)),': Preprocessing functional data']);
    REDO='Yes';filename=fullfile(filepathresults,['DATA_Subject',num2str(1,'%03d'),'_Condition',num2str(1,'%03d'),'.mat']);
    if ~isempty(dir(filename)),if isfield(CONN_x,'gui')&&isstruct(CONN_x.gui)&&isfield(CONN_x.gui,'overwrite'), REDO=CONN_x.gui.overwrite; else, REDO=questdlg('Overwrite existing subject results?','','Yes', 'No', 'Yes');end; end
	N=CONN_x.Setup.nsubjects; %sum(CONN_x.Setup.nsessions); if length(CONN_x.Setup.nsessions)==1, N=N*CONN_x.Setup.nsubjects; end
	n=0;
	for nsub=1:CONN_x.Setup.nsubjects,
        filename=fullfile(filepathresults,['DATA_Subject',num2str(nsub,'%03d'),'_Condition',num2str(1,'%03d'),'.mat']);
        if strcmp(REDO,'Yes')||isempty(dir(filename)),
            nsess=CONN_x.Setup.nsessions(min(length(CONN_x.Setup.nsessions),nsub));
            clear Y X iX X1 X2 C;
            for nses=1:nsess, % loads all ROI COV COND data for this subject
                filename=fullfile(filepath,['DATA_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'.mat']);
                if isempty(dir(filename)), disp(['Not ready to process step conn_process_6']); conn_waitbar('close',h); return; end
                Y{nses}=conn_vol(filename);
                filename=fullfile(filepath,['ROI_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'.mat']);
                X1{nses}=load(filename);
                filename=fullfile(filepath,['COV_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'.mat']);
                X2{nses}=load(filename);
                filename=fullfile(filepath,['COND_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'.mat']);
                C{nses}=load(filename);
                X{nses}=conn_designmatrix(CONN_x.Preproc.confounds,X1{nses},X2{nses});
                %X{nses}=conn_filter(CONN_x.Setup.RT,CONN_x.Preproc.filter,X{nses});
                if size(X{nses},1)~=CONN_x.Setup.nscans{nsub}{nses}, error('Wrong dimensions'); end
                iX{nses}=pinv(X{nses});
            end
            clear nsamples time0 dataroi conditionsweights;
            for ncondition=1:nconditions, % computes number of samples per condition
                nsamples{ncondition}=0; for nses=1:nsess, nsamples{ncondition}=nsamples{ncondition}+length(C{nses}.samples{ncondition}); end
                % 			dataroi{ncondition}=cell(1,length(X1{1}.data));
                conditionsweights{ncondition}=cell(1,length(C{1}.weights{ncondition}));
                for nses=1:nsess,
                    for nweight=1:length(C{nses}.weights{ncondition}),
                        conditionsweights{ncondition}{nweight}=cat(1,conditionsweights{ncondition}{nweight},C{nses}.weights{ncondition}{nweight});
                    end
                end
            end
            clear Yout;
            for ncondition=1:nconditions,
                filename=fullfile(filepathresults,['DATA_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
                Yout{ncondition}=Y{1}; Yout{ncondition}.fname=filename;
                Yout{ncondition}.size.Nt=nsamples{ncondition};
                Yout{ncondition}.conditionsweights=conditionsweights{ncondition};
                Yout{ncondition}=conn_init_vol(Yout{ncondition});
            end
            B=[];
            for slice=1:Y{1}.matdim.dim(3),
                Bb=[];
                if 1, % analyses per slice (all sessions together, faster but requires more memory)
                    clear y;
                    for nses=1:nsess,
                        [y{nses},idx]=conn_get_slice(Y{nses},slice);
                        if size(y{nses},1)~=CONN_x.Setup.nscans{nsub}{nses}, error('Wrong dimensions'); end
                        if slice==1&&rank(X{nses})>=size(y{nses},1), disp(['Warning: Over-determined model (no degrees of freedom for subject ',num2str(nsub),' session ',num2str(nses),'). Please consider reducing the number, dimensions, or covariates order of the confounds or disregarding this subject/session']); end
                        b=iX{nses}*y{nses};
                        y{nses}=y{nses}-X{nses}*b;
                        y{nses}=conn_filter(CONN_x.Setup.RT,CONN_x.Preproc.filter,y{nses});
                        if isfield(CONN_x.Setup,'outputfiles')&&numel(CONN_x.Setup.outputfiles)>=1&&CONN_x.Setup.outputfiles(1),
                            Bb=cat(1,Bb,b);
                        end
                    end
                    for ncondition=1:nconditions,
                        ytemp=[]; for nses=1:nsess, ytemp=cat(1,ytemp,y{nses}(C{nses}.samples{ncondition},:)); end
                        conn_write_slice(Yout{ncondition},ytemp,slice);
                    end
                else, % analyses per slice/session (slower but requires less memory)
                    for nses=1:nsess,
                        [y,idx]=conn_get_slice(Y{nses},slice);
                        if size(y,1)~=CONN_x.Setup.nscans{nsub}{nses}, error('Wrong dimensions'); end
                        if slice==1&&rank(X{nses})>=size(y,1), disp(['Warning: Over-determined model (no degrees of freedom for subject ',num2str(nsub),' session ',num2str(nses),'). Please consider reducing the number, dimensions, or covariates order of the confounds or disregarding this subject/session']); end
                        b=iX{nses}*y;
                        y=y-X{nses}*b;
                        y=conn_filter(CONN_x.Setup.RT,CONN_x.Preproc.filter,y);
                        if isfield(CONN_x.Setup,'outputfiles')&&numel(CONN_x.Setup.outputfiles)>=1&&CONN_x.Setup.outputfiles(1),
                            Bb=cat(1,Bb,b);
                        end
                        for ncondition=1:nconditions,
                            if nses==1, time0{ncondition}=1; end
                            conn_write_slice(Yout{ncondition},y(C{nses}.samples{ncondition},:),slice,time0{ncondition});
                            time0{ncondition}=time0{ncondition}+length(C{nses}.samples{ncondition});
                        end
                    end
                end
                if isfield(CONN_x.Setup,'outputfiles')&&numel(CONN_x.Setup.outputfiles)>=1&&CONN_x.Setup.outputfiles(1),                
                    if 0, %%% 0 to avoid memory errors
                        B=cat(2,B,Bb);
                    else
                        if slice==1
                            V=struct('mat',Y{1}.matdim.mat,'dim',Y{1}.matdim.dim,'pinfo',[1;0;0],'fname',fullfile(filepathresults,['BETA_Subject',num2str(nsub,'%03d'),'.nii']),...
                                'dt',[spm_type('float32') spm_platform('bigend')]);
                            %V=CONN_x.Setup.structural{nsub}{3}; V=V(1);
                            %if isfield(V,'dt'), V.dt=[spm_type('float32') spm_platform('bigend')];
                            %elseif length(V.dim)>3, V.dim(4)=spm_type('float32'); end
                            %V.fname=fullfile(filepathresults,['BETA_Subject',num2str(nsub),'.nii']);
                            V=repmat(V,[size(Bb,1),1]);for nh=1:numel(V),V(nh).n=[nh,1];end
                            V=spm_create_vol(V);
                            %                         for n1=1:size(Bb,1)
                            %                             V(n1)=V(1);
                            %                             V(n1).fname=fullfile(filepathresults,['BETA_Subject',num2str(nsub),'_Regressor',num2str(n1,'%04d'),'.nii']);
                            %                             V(n1)=spm_create_vol(V(n1));
                            %                         end
                        end
                        t=nan+zeros(Y{1}.matdim.dim(1:2));
                        for n1=1:size(Bb,1),
                            t(idx)=Bb(n1,:);
                            V(n1)=spm_write_plane(V(n1),t,slice);
                        end
                    end
                end
                conn_waitbar((n+slice/Y{1}.matdim.dim(3))/N,h);
            end
            if 0,%%% 0 to avoid memory errors
                if isfield(CONN_x.Setup,'outputfiles')&&numel(CONN_x.Setup.outputfiles)>=1&&CONN_x.Setup.outputfiles(1),
                    t=nan+zeros(Y{1}.matdim.dim);
                    V=struct('mat',Y{1}.matdim.mat,'dim',Y{1}.matdim.dim,'pinfo',[1;0;0],'fname','',...
                        'dt',[spm_type('float32') spm_platform('bigend')]);
                    %V=CONN_x.Setup.structural{nsub}{3}; V=V(1);
                    %if isfield(V,'dt'), V.dt=[spm_type('float32') spm_platform('bigend')];
                    %elseif length(V.dim)>3, V.dim(4)=spm_type('float32'); end
                    for n1=1:size(B,1),
                        t(Y{1}.voxels)=B(n1,:);
                        V.fname=fullfile(filepathresults,['BETA_Subject',num2str(nsub,'%03d'),'_Regressor',num2str(n1,'%04d'),'.nii']);
                        spm_write_vol(V,t);
                    end
                end
            end
            if isfield(CONN_x.Setup,'outputfiles')&&numel(CONN_x.Setup.outputfiles)>=2&&CONN_x.Setup.outputfiles(2),
                for ncondition=1:nconditions,
                    conn_matc2nii(Yout{ncondition}.fname,0);
                end
            end
        end
        
        n=n+1;
        conn_waitbar(n/N,h);
    end
    conn_waitbar('close',h);
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creates ROI_Subject###_Condition###.mat files (roi data after removal of confounding effects & filtering)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if any(options==7) && any(CONN_x.Setup.steps([1,2])),
	[path,name,ext]=fileparts(CONN_x.filename);
    filepath=CONN_x.folders.data;
	filepathresults=CONN_x.folders.preprocessing;
	nconditions=length(CONN_x.Setup.conditions.names)-1;
	h=conn_waitbar(0,['Step ',num2str(sum(options<=7)),'/',num2str(length(options)),': Preprocessing ROI data']);
    %REDO='Yes';filename=fullfile(filepathresults,['ROI_Subject',num2str(1,'%03d'),'_Condition',num2str(1,'%03d'),'.mat']);
    %if ~isempty(dir(filename)),if isfield(CONN_x,'gui')&&isstruct(CONN_x.gui)&&isfield(CONN_x.gui,'overwrite'), REDO=CONN_x.gui.overwrite; else, REDO=questdlg('Overwrite existing subject results?','','Yes', 'No', 'Yes');end; end
    REDO=[];
	N=CONN_x.Setup.nsubjects; %sum(CONN_x.Setup.nsessions); if length(CONN_x.Setup.nsessions)==1, N=N*CONN_x.Setup.nsubjects; end
	n=0;
	for nsub=1:CONN_x.Setup.nsubjects,
        filename=fullfile(filepathresults,['ROI_Subject',num2str(nsub,'%03d'),'_Condition',num2str(1,'%03d'),'.mat']);
        if isempty(REDO)&&~isempty(dir(filename)),
            if isfield(CONN_x,'gui')&&isstruct(CONN_x.gui)&&isfield(CONN_x.gui,'overwrite'), REDO=CONN_x.gui.overwrite; else, REDO=questdlg('Overwrite existing subject results?','','Yes', 'No', 'Yes');end;
        end
        if strcmp(REDO,'Yes')||isempty(dir(filename)),
            nsess=CONN_x.Setup.nsessions(min(length(CONN_x.Setup.nsessions),nsub));
            clear Y X iX X1 X2 C;
            for nses=1:nsess, % loads all ROI COV COND data for this subject
                filename=fullfile(filepath,['ROI_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'.mat']);
                if isempty(dir(filename)), disp(['Not ready to process step conn_process_7']); conn_waitbar('close',h); return; end
                X1{nses}=load(filename);
                filename=fullfile(filepath,['COV_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'.mat']);
                X2{nses}=load(filename);
                filename=fullfile(filepath,['COND_Subject',num2str(nsub,'%03d'),'_Session',num2str(nses,'%03d'),'.mat']);
                C{nses}=load(filename);
                X{nses}=conn_designmatrix(CONN_x.Preproc.confounds,X1{nses},X2{nses});
                %X{nses}=conn_filter(CONN_x.Setup.RT,CONN_x.Preproc.filter,X{nses});
                if size(X{nses},1)~=CONN_x.Setup.nscans{nsub}{nses}, error('Wrong dimensions'); end
                iX{nses}=pinv(X{nses});
            end
            clear nsamples time0 dataroi d1dataroi d2dataroi conditionsweights;
            for ncondition=1:nconditions, % computes number of samples per condition
                nsamples{ncondition}=0; for nses=1:nsess, nsamples{ncondition}=nsamples{ncondition}+length(C{nses}.samples{ncondition}); end
                dataroi{ncondition}=cell(1,length(X1{1}.data)+length(X2{1}.data));
                d1dataroi{ncondition}=cell(1,length(X1{1}.data)+length(X2{1}.data));
                d2dataroi{ncondition}=cell(1,length(X1{1}.data)+length(X2{1}.data));
                conditionsweights{ncondition}=cell(1,length(C{1}.weights{ncondition}));
                for nses=1:nsess,
                    for nweight=1:length(C{nses}.weights{ncondition}),
                        conditionsweights{ncondition}{nweight}=cat(1,conditionsweights{ncondition}{nweight},C{nses}.weights{ncondition}{nweight});
                    end
                end
            end
            for nroi=1:length(X1{1}.data),
                for nses=1:nsess,
                    y=X1{nses}.data{nroi};
                    if size(y,1)~=CONN_x.Setup.nscans{nsub}{nses}, error('Wrong dimensions'); end
                    b=iX{nses}*y;
                    y=y-X{nses}*b;
                    y=conn_filter(CONN_x.Setup.RT,CONN_x.Preproc.filter,y);
                    d1y=convn(cat(1,y(1,:),y,y(end,:)),[1;0;-1]/2,'valid');
                    d2y=convn(cat(1,d1y(1,:),d1y,d1y(end,:)),[1;0;-1]/2,'valid');
                    for ncondition=1:nconditions,
                        dataroi{ncondition}{nroi}=cat(1,dataroi{ncondition}{nroi},y(C{nses}.samples{ncondition},:));
                        d1dataroi{ncondition}{nroi}=cat(1,d1dataroi{ncondition}{nroi},d1y(C{nses}.samples{ncondition},:));
                        d2dataroi{ncondition}{nroi}=cat(1,d2dataroi{ncondition}{nroi},d2y(C{nses}.samples{ncondition},:));
                    end
                end
            end
            for ncov=1:length(X2{1}.data),
                for nses=1:nsess,
                    y=X2{nses}.data{ncov};
                    if size(y,1)~=CONN_x.Setup.nscans{nsub}{nses}, error('Wrong dimensions'); end
                    b=iX{nses}*y;
                    y=y-X{nses}*b;
                    y=conn_filter(CONN_x.Setup.RT,CONN_x.Preproc.filter,y);
                    d1y=convn(cat(1,y(1,:),y,y(end,:)),[1;0;-1]/2,'valid');
                    d2y=convn(cat(1,d1y(1,:),d1y,d1y(end,:)),[1;0;-1]/2,'valid');
                    for ncondition=1:nconditions,
                        if size(y,2)>size(dataroi{ncondition}{length(X1{1}.data)+ncov},2)&&size(dataroi{ncondition}{length(X1{1}.data)+ncov},2)>0, 
                            dataroi{ncondition}{length(X1{1}.data)+ncov}=cat(2,dataroi{ncondition}{length(X1{1}.data)+ncov}, zeros(size(dataroi{ncondition}{length(X1{1}.data)+ncov},1),size(y,2)-size(dataroi{ncondition}{length(X1{1}.data)+ncov},2))); 
                            d1dataroi{ncondition}{length(X1{1}.data)+ncov}=cat(2,d1dataroi{ncondition}{length(X1{1}.data)+ncov}, zeros(size(d1dataroi{ncondition}{length(X1{1}.data)+ncov},1),size(y,2)-size(d1dataroi{ncondition}{length(X1{1}.data)+ncov},2))); 
                            d2dataroi{ncondition}{length(X1{1}.data)+ncov}=cat(2,d2dataroi{ncondition}{length(X1{1}.data)+ncov}, zeros(size(d2dataroi{ncondition}{length(X1{1}.data)+ncov},1),size(y,2)-size(d2dataroi{ncondition}{length(X1{1}.data)+ncov},2))); 
                        end
                        if size(y,2)<size(dataroi{ncondition}{length(X1{1}.data)+ncov},2), 
                            y=cat(2,y,zeros(size(y,1),size(dataroi{ncondition}{length(X1{1}.data)+ncov},2)-size(y,2))); 
                            d1y=cat(2,d1y,zeros(size(d1y,1),size(d1dataroi{ncondition}{length(X1{1}.data)+ncov},2)-size(d1y,2))); 
                            d2y=cat(2,d2y,zeros(size(d2y,1),size(d2dataroi{ncondition}{length(X1{1}.data)+ncov},2)-size(d2y,2))); 
                        end
                        dataroi{ncondition}{length(X1{1}.data)+ncov}=cat(1,dataroi{ncondition}{length(X1{1}.data)+ncov},y(C{nses}.samples{ncondition},:));
                        d1dataroi{ncondition}{length(X1{1}.data)+ncov}=cat(1,d1dataroi{ncondition}{length(X1{1}.data)+ncov},d1y(C{nses}.samples{ncondition},:));
                        d2dataroi{ncondition}{length(X1{1}.data)+ncov}=cat(1,d2dataroi{ncondition}{length(X1{1}.data)+ncov},d2y(C{nses}.samples{ncondition},:));
                    end
                end
            end  
            
            for ncondition=1:nconditions,
                data=dataroi{ncondition};
                d1data=d1dataroi{ncondition};
                d2data=d2dataroi{ncondition};
                names=cat(2,X1{1}.names,X2{1}.names);
                xyz=cat(2,X1{1}.xyz,repmat({[nan,nan,nan]},[1,length(X2{1}.data)]));
                %voxels=X1{1}.voxels;
                %weights=X1{1}.weights;
                source=X1{1}.source;
                conditionname=C{1}.names{ncondition};
                conditionweights=conditionsweights{ncondition};
                filename=fullfile(filepathresults,['ROI_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
                save(filename,'data','d1data','d2data','names','xyz','source','conditionweights','conditionname');
%                 if str2num(version('-release'))>=14, save(filename,'-V6','data','names','xyz','source','conditionweights','conditionname');
%                 else, save(filename,'data','names','xyz','source','conditionweights','conditionname');end
            end
        end
        
        n=n+1;
        conn_waitbar(n/N,h);
    end
    conn_waitbar('close',h);
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creates vvPC_Subject###_Condition###.mat files (voxel-to-voxel first-level SVD decomposition)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if any(options==8) && any(CONN_x.Setup.steps([3])),
    [path,name,ext]=fileparts(CONN_x.filename);
    filepath=CONN_x.folders.preprocessing;
    nconditions=length(CONN_x.Setup.conditions.names)-1;
    h=conn_waitbar(0,['Step ',num2str(sum(options<=8)),'/',num2str(length(options)),': preprocessing voxel-to-voxel covariance']);
    REDO=[];
% 	filename=fullfile(fileparts(which('spm')),'apriori','brainmask.nii');
% 	Vmask=spm_vol(filename);
%     THR_MASK=.25;
    MAXDIMS=256;
    filename=fullfile(filepath,['DATA_Subject',num2str(1,'%03d'),'_Condition',num2str(1,'%03d'),'.mat']);
    if isempty(dir(filename)), disp(['Not ready to process step conn_process_8']); return; end
    Y=conn_vol(filename);
    N=1.1*CONN_x.Setup.nsubjects*nconditions*Y.matdim.dim(3);n=0; 
        
    for nsub=1:CONN_x.Setup.nsubjects,
        for ncondition=1:nconditions,
            %filename=fullfile(filepath,['vvPCcov_SubjectA',num2str(nsub,'%03d'),'_SubjectB',num2str(nsub,'%03d'),'_ConditionA',num2str(ncondition,'%03d'),'_ConditionB',num2str(ncondition,'%03d'),'.mat']); 
            filename=fullfile(filepath,['vvPC_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
            if isempty(REDO)&&~isempty(dir(filename)),
                if isfield(CONN_x,'gui')&&isstruct(CONN_x.gui)&&isfield(CONN_x.gui,'overwrite'), REDO=CONN_x.gui.overwrite; else, REDO=questdlg('Overwrite existing subject results?','','Yes', 'No', 'Yes');end;
            end
            if strcmp(REDO,'Yes')||(isempty(dir(filename))),
                filename=fullfile(filepath,['DATA_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
                if isempty(dir(filename)), disp(['Not ready to process step conn_process_8']); return; end
                Y=conn_vol(filename);
                if isfield(Y,'conditionsweights')
                    clear X1;
                    X1.conditionweights=Y.conditionsweights;
                else
                    filename=fullfile(filepath,['ROI_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
                    X1=load(filename);
                end
                
                DOF=max(0,Y.size.Nt*(min(1/(2*CONN_x.Setup.RT),CONN_x.Preproc.filter(2))-max(0,CONN_x.Preproc.filter(1)))/(1/(2*CONN_x.Setup.RT))+1);
                Cy=0;Cidx=[];
                for slice=1:Y.matdim.dim(3),
                    [y,idx]=conn_get_slice(Y,slice);
                    %[xyzx,xyzy]=ind2sub(Y.matdim.dim(1:2),idx);xyz=Y.matdim.mat*[xyzx,xyzy,zeros(size(xyzx))+slice,ones(size(xyzx))]';
                    %z=spm_get_data(Vmask,pinv(Vmask(1).mat)*xyz);
                    %idxt=find(z>THR_MASK&~any(isnan(y),1));
                    idxt=find(~any(isnan(y),1));
                    if ~isempty(idxt),
                        Cidx=cat(1,Cidx,idx(idxt)+(slice-1)*Y.matdim.dim(1)*Y.matdim.dim(2));
                        y=detrend(y(:,idxt),'constant');
                        y=y.*repmat(X1.conditionweights{1},[1,size(y,2)]);
                        y=y.*repmat(sqrt(1./max(eps,sum(abs(y).^2,1))),[size(y,1),1]);
                        Cy=Cy+y*y';
                    end
                    n=n+.1;
                    conn_waitbar(n/N,h);
                end
                [Q1,D]=svd(Cy);
                D=diag(D);
                DIMS=min([MAXDIMS,ceil(DOF),sum(D>1e-8)]);
                Q1=Q1(:,1:DIMS);
                D=D(1:DIMS);
                filename_D=fullfile(filepath,['vvPCeig_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
                save(filename_D,'D');
%                 filename_A=fullfile(filepath,['vvPC_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.nii']); % spatial base
%                 Yout_A=struct('fname',filename_A,'mat',Y.matdim.mat,'dim',Y.matdim.dim,'pinfo',[1;0;0],'n',[1,1],'dt',[spm_type('float32'),spm_platform('bigend')],'descrip','conn SVD (spatial base)');
%                 Yout_A=repmat(Yout_A,[DIMS,1]);for nh=1:DIMS,Yout_A(nh).n=[nh,1];end
%                 Yout_A=spm_create_vol(Yout_A);
                filename_A=fullfile(filepath,['vvPC_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']); % spatial base
                Yout_A=Y; Yout_A.fname=filename_A;Yout_A.size.Nt=DIMS;Yout_A.DOF=DOF; Yout_A.BASE.Q1=Q1;Yout_A.BASE.D=D;
                Yout_A=conn_init_vol(Yout_A,Cidx);
                for slice=1:Y.matdim.dim(3),
                    [y,idx]=conn_get_slice(Y,slice);
                    %[xyzx,xyzy]=ind2sub(Y.matdim.dim(1:2),idx);xyz=Y.matdim.mat*[xyzx,xyzy,zeros(size(xyzx))+slice,ones(size(xyzx))]';
                    %z=spm_get_data(Vmask,pinv(Vmask(1).mat)*xyz);
                    %idxt=find(z>THR_MASK&~any(isnan(y),1));
                    idxt=find(~any(isnan(y),1));
                    if ~isempty(idxt),
                        y=detrend(y(:,idxt),'constant');
                        y=y.*repmat(X1.conditionweights{1},[1,size(y,2)]);
                        y=y.*repmat(sqrt(1./max(eps,sum(abs(y).^2,1))),[size(y,1),1]);
                        Q2=Q1'*y;
                        e=sum(abs(y).^2,1);
                        conn_write_slice(Yout_A,Q2,slice);
%                         Fplane=zeros(Y.matdim.dim(1:2));
%                         for ndim=1:DIMS,
%                             Fplane(idx(idxt))=Q2(ndim,:);
%                             Yout_A(ndim)=spm_write_plane(Yout_A(ndim),Fplane,slice);
% %                             conn_write_slice(Yout_A,Q2(ndim,:),slice,ndim);
%                         end
%                     else
%                         Fplane=zeros(Y.matdim.dim(1:2));
%                         for ndim=1:DIMS,
%                             Yout_A(ndim)=spm_write_plane(Yout_A(ndim),Fplane,slice);
%                         end
                    end
                    n=n+1;
                    conn_waitbar(n/N,h);
                end
            else, n=n+1.1*Y.matdim.dim(3); end
        end
    end
    conn_waitbar('close',h);
%     if nconditions>1
%         N=CONN_x.Setup.nsubjects*(nconditions-1);n=0;
%         h=conn_waitbar(0,['Step ',num2str(sum(options<=8)),'/',num2str(length(options)),': preprocessing subject-to-subject covariance']);
%         for nsub=1:CONN_x.Setup.nsubjects,
%             for ncondition=2:nconditions,
%                 filename=fullfile(filepath,['vvPCeig_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
%                 %filename=fullfile(filepath,['vvPC_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.nii']);
%                 if isempty(REDO)&&~isempty(dir(filename)),
%                     if isfield(CONN_x,'gui')&&isstruct(CONN_x.gui)&&isfield(CONN_x.gui,'overwrite'), REDO=CONN_x.gui.overwrite; else, REDO=questdlg('Overwrite existing subject results?','','Yes', 'No', 'Yes');end;
%                 end
%                 if strcmp(REDO,'Yes')||(isempty(dir(filename))),
%                     %                 filename_A=fullfile(filepath,['vvPC_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.nii']);
%                     %                 Yout_A=spm_vol(filename_A);
%                     filename_A=fullfile(filepath,['vvPC_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
%                     Yout_A=conn_vol(filename_A);
%                     %                 [gridx,gridy]=ndgrid(1:Yout_A(1).dim(1),1:Yout_A(1).dim(2));xyz=[gridx(:),gridy(:),ones(numel(gridx),2)]';
%                     Dall=zeros(Yout_A.size.Nt,Yout_A.size.Nt,ncondition);
%                     for slice=1:Yout_A.size.Ns,
%                         %                     xyz(3,:)=slice;
%                         yA=conn_get_slice(Yout_A,slice);
%                         for ncondition2=1:ncondition-1,
%                             filename_B=fullfile(filepath,['vvPC_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition2,'%03d'),'.mat']);
%                             Yout_B=conn_vol(filename_B);
%                             yB=conn_get_slice(Yout_B,slice);
%                             Dall(:,:,ncondition2)=Dall(:,:,ncondition2)+yA*yB';
%                         end
%                     end
%                     for ncondition2=1:ncondition-1,
%                         D=Dall(:,:,ncondition2);
%                         filename_D=fullfile(filepath,['vvPCeig_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Condition',num2str(ncondition2,'%03d'),'.mat']); % between-condition cross-product
%                         save(filename_D,'D');
%                     end
%                     n=n+1;
%                     conn_waitbar(n/N,h);
%                 else, n=n+1; end
%             end
%         end
%         conn_waitbar('close',h);
%     end
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% updates CONN_x.Analyses structure with all ROIs
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if any(options==9),
    if any(CONN_x.Setup.steps([1,2]))
        [path,name,ext]=fileparts(CONN_x.filename);
        filepath=CONN_x.folders.preprocessing;
        filename1=fullfile(filepath,['ROI_Subject',num2str(1,'%03d'),'_Condition',num2str(1,'%03d'),'.mat']);
        if isempty(dir(filename1)), disp(['Not ready to process step conn_process_9']); return; end
        x1=load(filename1);
        if nargin>1,analyses=varargin{1}; % selected analysis only
        else, analyses=1:length(CONN_x.Analyses); end;
        doanalyses=analyses>0;
        analyses=analyses(doanalyses);
        analysisbak=CONN_x.Analysis;
        for ianalysis=analyses,
            CONN_x.Analysis=ianalysis;
            if isempty(CONN_x.Analyses(ianalysis).name),CONN_x.Analyses(ianalysis).name=['ANALYSIS_',num2str(ianalysis,'%02d')]; end;
            if ~exist(fullfile(CONN_x.folders.firstlevel,CONN_x.Analyses(ianalysis).name),'dir'), [ok,nill]=mkdir(CONN_x.folders.firstlevel,CONN_x.Analyses(ianalysis).name); end;
            CONN_x.Analyses(ianalysis).variables.names={};
            CONN_x.Analyses(ianalysis).variables.types={};
            CONN_x.Analyses(ianalysis).variables.deriv={};
            CONN_x.Analyses(ianalysis).variables.dimensions={};
            for n1=1:length(x1.names), idx=strmatch(x1.names{n1},CONN_x.Preproc.confounds.names,'exact'); if isempty(idx),
                    CONN_x.Analyses(ianalysis).variables.names{end+1}=x1.names{n1};
                    CONN_x.Analyses(ianalysis).variables.types{end+1}='roi';
                    CONN_x.Analyses(ianalysis).variables.deriv{end+1}=0;
                    CONN_x.Analyses(ianalysis).variables.dimensions{end+1}=[size(x1.data{n1},2),size(x1.data{n1},2)];
                end
            end
            if isfield(CONN_x.Analyses(ianalysis).regressors,'names') && ~isempty(CONN_x.Analyses(ianalysis).regressors.names), initial=CONN_x.Analyses(ianalysis).regressors.names; dims=CONN_x.Analyses(ianalysis).regressors.dimensions; ders=CONN_x.Analyses(ianalysis).regressors.deriv;
            else, initial=CONN_x.Analyses(ianalysis).variables.names; dims={}; ders={}; end
            CONN_x.Analyses(ianalysis).regressors.names={};
            CONN_x.Analyses(ianalysis).regressors.types={};
            CONN_x.Analyses(ianalysis).regressors.deriv={};
            CONN_x.Analyses(ianalysis).regressors.dimensions={};
            for n1=1:length(initial),
                idx=strmatch(initial{n1},CONN_x.Analyses(ianalysis).variables.names,'exact');
                if ~isempty(idx)&&~strcmp(initial{n1},'Grey Matter')&&~strcmp(initial{n1},'White Matter')&&~strcmp(initial{n1},'CSF'),
                    CONN_x.Analyses(ianalysis).regressors.names{end+1}=CONN_x.Analyses(ianalysis).variables.names{idx};
                    CONN_x.Analyses(ianalysis).regressors.types{end+1}=CONN_x.Analyses(ianalysis).variables.types{idx};
                    if length(ders)>=n1&&~isempty(ders{n1}), CONN_x.Analyses(ianalysis).regressors.deriv{end+1}=ders{n1}; else, CONN_x.Analyses(ianalysis).regressors.deriv{end+1}=CONN_x.Analyses(ianalysis).variables.deriv{idx};end
                    if length(dims)>=n1&&~isempty(dims{n1}), CONN_x.Analyses(ianalysis).regressors.dimensions{end+1}=[min(dims{n1}(1),CONN_x.Analyses(ianalysis).variables.dimensions{idx}(1)),CONN_x.Analyses(ianalysis).variables.dimensions{idx}(1)];
                    else, CONN_x.Analyses(ianalysis).regressors.dimensions{end+1}=CONN_x.Analyses(ianalysis).variables.dimensions{idx}; end
                end
            end
            if ~isfield(CONN_x.Analyses(ianalysis),'measure') || isempty(CONN_x.Analyses(ianalysis).measure), CONN_x.Analyses(ianalysis).measure=1; end
            if ~isfield(CONN_x.Analyses(ianalysis),'weight') || isempty(CONN_x.Analyses(ianalysis).weight), CONN_x.Analyses(ianalysis).weight=2; end
        end
        CONN_x.Analysis=analysisbak;
    end
    if any(CONN_x.Setup.steps([3]))&&(nargin<=1||any(varargin{1}==0)),
        CONN_x.vvAnalyses.variables=conn_v2v('measures');
        if isfield(CONN_x.vvAnalyses.regressors,'names') && ~isempty(CONN_x.vvAnalyses.regressors.names), 
            initial=CONN_x.vvAnalyses.regressors;
            CONN_x.vvAnalyses.regressors=conn_v2v('empty');
            for n1=1:numel(initial.names)
                idx=strmatch(initial.names{n1},CONN_x.vvAnalyses.variables.names,'exact');
                optionsnames=fieldnames(CONN_x.vvAnalyses.variables);
                for n2=1:numel(optionsnames),
                    if ~isempty(idx)&&isempty(initial.(optionsnames{n2}){n1}), CONN_x.vvAnalyses.regressors.(optionsnames{n2}){n1}=CONN_x.vvAnalyses.variables.(optionsnames{n2}){idx(1)};
                    else CONN_x.vvAnalyses.regressors.(optionsnames{n2}){n1}=initial.(optionsnames{n2}){n1};
                    end
                end
                if isempty(idx), CONN_x.vvAnalyses.regressors.measuretype{n1}=1; end
            end
        else
            CONN_x.vvAnalyses.regressors=CONN_x.vvAnalyses.variables;
        end
    end
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creates resultsDATA_Subject###_Condition###.mat files (first-level voxel-to-voxel analysis)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if 0,%any(options==8.5),
    [path,name,ext]=fileparts(CONN_x.filename);
    filepath=CONN_x.folders.preprocessing;
    nconditions=length(CONN_x.Setup.conditions.names)-1;
    h=conn_waitbar(0,['Step ',num2str(sum(options<=8.5)),'/',num2str(length(options)),': voxel-to-voxel first-level analyses']);
    % workinprogress
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creates resultsDATA_Subject###_Condition###_Source###.mat files (first-level ROI-to-voxel analysis)
% Creates BETA_Subject###_Condition###_Source###.mat files (first-level seed-to-voxel analyses)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if any(options==10) && any(CONN_x.Setup.steps([2])),
    [path,name,ext]=fileparts(CONN_x.filename);
    filepath=CONN_x.folders.preprocessing;
    nconditions=length(CONN_x.Setup.conditions.names)-1;
    filename=fullfile(filepath,['ROI_Subject',num2str(1,'%03d'),'_Condition',num2str(1,'%03d'),'.mat']);
    if isempty(dir(filename)), disp(['Not ready to process step conn_process_10']); return; end
    X1=load(filename);
    if nargin>1,analyses=varargin{1}; % selected analysis only
    else, analyses=1:length(CONN_x.Analyses); end; 
    doanalyses=false(1,numel(analyses));
    for nanalyses=1:numel(analyses),if analyses(nanalyses)>0&&any(CONN_x.Analyses(analyses(nanalyses)).type==[2,3]), doanalyses(nanalyses)=true; end; end
    analyses=analyses(doanalyses);
    h=conn_waitbar(0,['Step ',num2str(sum(options<=10)),'/',num2str(length(options)),': ROI-to-voxel first-level analyses']);
    REDO=[];
    analysisbak=CONN_x.Analysis;
    for nanalyses=1:length(analyses),
        ianalysis=analyses(nanalyses);
        CONN_x.Analysis=ianalysis;
%         ianalysis=CONN_x.Analysis;
        filepathresults=fullfile(CONN_x.folders.firstlevel,CONN_x.Analyses(ianalysis).name);
        [X,nill,names]=conn_designmatrix(CONN_x.Analyses(ianalysis).regressors,X1,[]);
        nrois=size(X,2)-1;
        iroi=[];isnew=[];for nroi=1:nrois,[iroi(nroi),isnew(nroi)]=conn_sourcenames(names{nroi},'+');end
        
        filename=fullfile(filepath,['DATA_Subject',num2str(1,'%03d'),'_Condition',num2str(1,'%03d'),'.mat']);
        Y=conn_vol(filename);
        if nanalyses==1, N=CONN_x.Setup.nsubjects*nconditions*Y.matdim.dim(3)*length(analyses);n=0;end
        
        for ncondition=1:nconditions,
            for nsub=1:CONN_x.Setup.nsubjects,
                filename=fullfile(filepath,['DATA_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
                Y=conn_vol(filename);
                filename=fullfile(filepath,['ROI_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
                X1=load(filename);
                [X,nill,names]=conn_designmatrix(CONN_x.Analyses(ianalysis).regressors,X1,[]);
                clear Yout;
                for nroi=1:nrois,
                    filename=fullfile(filepathresults,['BETA_Subject',num2str(nsub),'_Condition',num2str(ncondition,'%03d'),'_Source',num2str(iroi(nroi),'%03d'),'.nii']);
                    %filename=fullfile(filepathresults,['resultsDATA_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Source',num2str(iroi(nroi),'%03d'),'.mat']);
                    isnew(nroi)=isnew(nroi)|isempty(dir(filename));
                end
                if any(isnew),
                    switch(CONN_x.Analyses(ianalysis).measure),
                        case {2,4}, %partial
                            isnew=ones(size(isnew));
                    end
                end
                if isempty(REDO)&&~all(isnew),
                    if isfield(CONN_x,'gui')&&isstruct(CONN_x.gui)&&isfield(CONN_x.gui,'overwrite'), REDO=CONN_x.gui.overwrite; else, REDO=questdlg('Overwrite existing subject results?','','Yes', 'No', 'Yes');end;
                end
                if strcmp(REDO,'No'),
                    idxredo=find(isnew);
                    X=cat(2,X(:,1),X(:,1+idxredo));
                else,
                    idxredo=1:nrois;
                end
                if length(idxredo)>0,
                    X=cat(2,X(:,1),detrend(X(:,2:end),'constant'));
                    switch(CONN_x.Analyses(ianalysis).weight),
                        case 1, 
                        case 2, X=X.*repmat(X1.conditionweights{1},[1,size(X,2)]);
                        case 3, X=X.*repmat(X1.conditionweights{2},[1,size(X,2)]);
                    end
                    switch(CONN_x.Analyses(ianalysis).measure),
                        case {1,3}, %bivariate
                            iX=pinv(diag(diag(X'*X)));
                            DOF=max(0,Y.size.Nt*(min(1/(2*CONN_x.Setup.RT),CONN_x.Preproc.filter(2))-max(0,CONN_x.Preproc.filter(1)))/(1/(2*CONN_x.Setup.RT))-1);
                        case {2,4}, %partial
                            iX=pinv(X'*X);
                            DOF=max(0,Y.size.Nt*(min(1/(2*CONN_x.Setup.RT),CONN_x.Preproc.filter(2))-max(0,CONN_x.Preproc.filter(1)))/(1/(2*CONN_x.Setup.RT))-rank(X)+1);
                    end
                    filename=fullfile(filepathresults,['se_Subject',num2str(nsub),'_Condition',num2str(ncondition,'%03d'),'.nii']);
                    SEout=struct('mat',Y.matdim.mat,'dim',Y.matdim.dim,'fname',filename,'dt',[spm_type('float32') spm_platform('bigend')]);
                    SEout=spm_create_vol(SEout);
%                     filename=fullfile(filepathresults,['seDATA_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
%                     SEout=Y; SEout.fname=filename;
%                     SEout.size.Nt=1;%CONN_x.Setup.nsubjects;
%                     SEout.DOF=DOF;
%                     SEout=conn_init_vol(SEout);
                    for nroi=1:length(idxredo),
                        filename=fullfile(filepathresults,['BETA_Subject',num2str(nsub),'_Condition',num2str(ncondition,'%03d'),'_Source',num2str(iroi(idxredo(nroi)),'%03d'),'.nii']);
                        Yout{nroi}=struct('mat',Y.matdim.mat,'dim',Y.matdim.dim,'fname',filename,'pinfo',[1;0;0],'n',[1,1],'dt',[spm_type('float32') spm_platform('bigend')]);
                        Yout{nroi}=spm_create_vol(Yout{nroi});
%                         filename=fullfile(filepathresults,['resultsDATA_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Source',num2str(iroi(idxredo(nroi)),'%03d'),'.mat']);
%                         Yout{nroi}=Y; Yout{nroi}.fname=filename;
%                         Yout{nroi}.size.Nt=1;%CONN_x.Setup.nsubjects;
%                         Yout{nroi}=conn_init_vol(Yout{nroi});
                    end
                    for slice=1:Y.matdim.dim(3),
                        [y,idx]=conn_get_slice(Y,slice);
                        y=detrend(y,'constant');
                        switch(CONN_x.Analyses(ianalysis).weight),
                            case 1,
                            case 2, y=y.*repmat(X1.conditionweights{1},[1,size(y,2)]);
                            case 3, y=y.*repmat(X1.conditionweights{2},[1,size(y,2)]);
                        end
                        B=iX*(X'*y);
                        e=sqrt(sum(abs(y).^2,1));
                        switch(CONN_x.Analyses(ianalysis).measure),
                            case {1,2}, %correlation
                                r=sqrt(diag(iX));
                                B=B./max(eps,r*e);
                                B=atanh(max(eps-1,min(1-eps,B)));
                                e(:)=1./max(eps,sqrt(DOF-3));
                            case {3,4}, %regression
                                e=e/max(eps,DOF);
                        end
                        %disp([slice,nsub])
%                         conn_write_slice(SEout,e,slice);%nsub);
%                         for nroi=1:length(idxredo);
%                             conn_write_slice(Yout{nroi},B(1+nroi,:),slice);%nsub);
%                         end
                        t=zeros(Y.matdim.dim(1:2));
                        t(idx)=e;
                        SEout=spm_write_plane(SEout,t,slice);
                        for nroi=1:length(idxredo);
                            t(idx)=B(1+nroi,:);
                            Yout{nroi}=spm_write_plane(Yout{nroi},t,slice);
                        end
                        n=n+1;
                        conn_waitbar(n/N,h);
                    end
                else, n=n+Y.matdim.dim(3); end
            end
        end
        CONN_x.Analyses(ianalysis).sources=names;
        fileout=fullfile(filepathresults,'_list_sources.txt');
        fh=fopen(fileout,'wt');
        for n1=1:length(CONN_x.Analyses(ianalysis).sourcenames),fprintf(fh,'Source%03d = %s\n',n1,CONN_x.Analyses(ianalysis).sourcenames{n1});end
        fclose(fh);
        fileout=fullfile(filepathresults,'_list_conditions.txt');
        fh=fopen(fileout,'wt');
        for n1=1:nconditions,fprintf(fh,'Condition%03d = %s\n',n1,CONN_x.Setup.conditions.names{n1});end
        fclose(fh);
    end
    CONN_x.Analysis=analysisbak;
    conn_waitbar('close',h); ;
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creates resultsROI_Subject###_Condition###.mat files (first-level ROI-to-ROI analyses)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if any(options==11) && any(CONN_x.Setup.steps([1])),
    [path,name,ext]=fileparts(CONN_x.filename);
    filepath=CONN_x.folders.preprocessing;
    if nargin>1,analyses=varargin{1}; % selected analysis only
    else, analyses=1:length(CONN_x.Analyses); end; 
    doanalyses=false(1,numel(analyses));
    for nanalyses=1:numel(analyses),if analyses(nanalyses)>0&&any(CONN_x.Analyses(analyses(nanalyses)).type==[1,3]), doanalyses(nanalyses)=true; end; end
    analyses=analyses(doanalyses);
    h=conn_waitbar(0,['Step ',num2str(sum(options<=11)),'/',num2str(length(options)),': ROI-to-ROI first-level analyses']);
    analysisbak=CONN_x.Analysis;
    for nanalyses=1:length(analyses),
        ianalysis=analyses(nanalyses);
        CONN_x.Analysis=ianalysis;
%         ianalysis=CONN_x.Analysis;
        filepathresults=fullfile(CONN_x.folders.firstlevel,CONN_x.Analyses(ianalysis).name);
        nconditions=length(CONN_x.Setup.conditions.names)-1;
        %REDO='Yes';filename=fullfile(filepathresults,['resultsROI_Subject',num2str(1,'%03d'),'_Condition',num2str(1,'%03d'),'.mat']);
        %if ~isempty(dir(filename)),if isfield(CONN_x,'gui')&&isstruct(CONN_x.gui)&&isfield(CONN_x.gui,'overwrite'), REDO=CONN_x.gui.overwrite; else, REDO=questdlg('Overwrite existing subject results?','','Yes', 'No', 'Yes');end; end
        if nanalyses==1, n=0; end
        
        for ncondition=1:nconditions,
            for nsub=1:CONN_x.Setup.nsubjects,
                filename=fullfile(filepathresults,['resultsROI_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
                if 1,%strcmp(REDO,'Yes')||isempty(dir(filename)),
                    filename=fullfile(filepath,['ROI_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
                    if isempty(dir(filename)), disp(['Not ready to process step conn_process_10']); conn_waitbar('close',h);return; end
                    X1=load(filename);
                    [X,nill,names]=conn_designmatrix(CONN_x.Analyses(ianalysis).regressors,X1,[]);
                    nrois=size(X,2)-1;
                    [X2,nill,names2,xyz2]=conn_designmatrix({CONN_x.Analyses(ianalysis).variables,CONN_x.Analyses(ianalysis).regressors},X1,[]);
                    nrois2=size(X2,2)-1;
                    idxroi1roi2=zeros(1,nrois);
                    for n1=1:nrois,temp=strmatch(names{n1},names2,'exact'); idxroi1roi2(n1)=temp(1);end
                    X2=cat(2,X2(:,1),X2(:,1+idxroi1roi2),X2(:,1+setdiff(1:nrois2,idxroi1roi2)));
                    names2=cat(2,{names2{idxroi1roi2}},{names2{setdiff(1:nrois2,idxroi1roi2)}});
                    xyz=cat(2,{xyz2{idxroi1roi2}},{xyz2{setdiff(1:nrois2,idxroi1roi2)}});
                    
                    if nanalyses==1&&nsub==1 && ncondition==1,N=CONN_x.Setup.nsubjects*nconditions*nrois2*length(analyses); nrois2bak=nrois2;
                    elseif nsub==1 && ncondition==1, N=N-CONN_x.Setup.nsubjects*nconditions*nrois2bak+CONN_x.Setup.nsubjects*nconditions*nrois2; end
                    Z=zeros(nrois,nrois2);%+diag(nan+zeros(nrois,1));
                    SE=zeros(1,nrois2);
                    X=cat(2,X(:,1),detrend(X(:,2:end),'constant'));X2=cat(2,X2(:,1),detrend(X2(:,2:end),'constant'));
                    switch(CONN_x.Analyses(ianalysis).weight),
                        case 1,
                        case 2, X=X.*repmat(X1.conditionweights{1},[1,size(X,2)]);X2=X2.*repmat(X1.conditionweights{1},[1,size(X2,2)]);
                        case 3, X=X.*repmat(X1.conditionweights{2},[1,size(X,2)]);X2=X2.*repmat(X1.conditionweights{2},[1,size(X2,2)]);
                    end
                    switch(CONN_x.Analyses(ianalysis).measure),
                        case {1,3}, %bivariate
                            DOF=max(0,size(X,1)*(min(1/(2*CONN_x.Setup.RT),CONN_x.Preproc.filter(2))-max(0,CONN_x.Preproc.filter(1)))/(1/(2*CONN_x.Setup.RT))-1);
                        case {2,4}, %partial
                            DOF=max(0,size(X,1)*(min(1/(2*CONN_x.Setup.RT),CONN_x.Preproc.filter(2))-max(0,CONN_x.Preproc.filter(1)))/(1/(2*CONN_x.Setup.RT))-rank(X)+1);
                    end
                    for nroi=1:nrois2,
                        y=X2(:,1+nroi);
                        switch(CONN_x.Analyses(ianalysis).measure),
                            case {1,3}, %bivariate
                                x=cat(2,X(:,1),X(:,1+setdiff(1:nrois,nroi)));
                                iX=pinv(diag(diag(x'*x)));
                            case {2,4}, %partial
                                x=cat(2,X(:,1),X(:,1+setdiff(1:nrois,nroi)));
                                iX=pinv(x'*x);
                        end
                        B=iX*(x'*y);
                        e=sqrt(sum(abs(y).^2,1));
                        switch(CONN_x.Analyses(ianalysis).measure),
                            case {1,2}, %correlation
                                r=sqrt(diag(iX));
                                B=B./max(eps,r*e);
                                B(~isnan(B))=atanh(max(eps-1,min(1-eps,B(~isnan(B)))));
                                SE(nroi)=1./max(eps,sqrt(DOF-3));
                            case {3,4},
                                SE(nroi)=e/max(eps,DOF);
                        end
                        Z(setdiff(1:nrois,nroi),nroi)=B(2:end);
                        if nroi<=nrois,Z(nroi,nroi)=nan;end
                        n=n+1;
                        conn_waitbar(n/N,h);
                    end
%                     xyz={}; %note: this assumes constant number of dimensions per subject for analysis regressors
%                     for n1=1:length(CONN_x.Analyses(ianalysis).variables.names),
%                         for n2=1:CONN_x.Analyses(ianalysis).variables.deriv{n1}+1,
%                             for n3=1:CONN_x.Analyses(ianalysis).variables.dimensions{n1}(1),
%                                 idx=strmatch(CONN_x.Analyses(ianalysis).variables.names{n1},X1.names,'exact');
%                                 if isempty(idx), xyz{end+1}=''; else, xyz{end+1}=X1.xyz{idx}; end
%                             end
%                         end;
%                     end
%                     xyz=cat(2,{xyz{idxroi1roi2}},{xyz{setdiff(1:nrois2,idxroi1roi2)}});
                    regressors=CONN_x.Analyses(ianalysis).regressors;
                    filename=fullfile(filepathresults,['resultsROI_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
                    save(filename,'Z','regressors','names','names2','xyz','SE','DOF');
                end
            end
        end
    end
    CONN_x.Analysis=analysisbak;
    conn_waitbar('close',h); ;
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creates BETA_Subject###_Condition###_Source###.mat files (first-level analysis results for SPM)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if 0,%any(options==12) && any(CONN_x.Setup.steps([2])),
    [path,name,ext]=fileparts(CONN_x.filename);
    filepath=CONN_x.folders.preprocessing;
    if nargin>1,analyses=varargin{1}; % selected analysis only
    else, analyses=1:length(CONN_x.Analyses); end; 
    doanalyses=false(1,numel(analyses));
    for nanalyses=1:numel(analyses),if analyses(nanalyses)>0&&any(CONN_x.Analyses(analyses(nanalyses)).type==[2,3]), doanalyses(nanalyses)=true; end; end
    analyses=analyses(doanalyses);
    h=conn_waitbar(0,['Step ',num2str(sum(options<=12)),'/',num2str(length(options)),': Creating BETA volumes']);
    analysisbak=CONN_x.Analysis;
    for nanalyses=1:length(analyses),
        ianalysis=analyses(nanalyses);
        CONN_x.Analysis=ianalysis;
%         ianalysis=CONN_x.Analysis;
        filepathresults=fullfile(CONN_x.folders.firstlevel,CONN_x.Analyses(ianalysis).name);
        nconditions=length(CONN_x.Setup.conditions.names)-1;
        %nrois=0;for n1=1:length(CONN_x.Analyses.regressors.names), nrois=nrois+CONN_x.Analyses.regressors.dimensions{n1}(1)*(CONN_x.Analyses.regressors.deriv{n1}+1); end;
        filename=fullfile(filepath,['ROI_Subject',num2str(1,'%03d'),'_Condition',num2str(1,'%03d'),'.mat']);
        if isempty(dir(filename)), disp(['Not ready to process step conn_process_11']); conn_waitbar('close',h);return; end
        X1=load(filename);
        [X,nill,names]=conn_designmatrix(CONN_x.Analyses(ianalysis).regressors,X1,[]);
        nrois=size(X,2)-1;
        iroi=[];isnew=[];for nroi=1:nrois,[iroi(nroi),isnew(nroi)]=conn_sourcenames(names{nroi},'-');end
        if any(isnew), error(['Non-existing ROI first-level data for ',names{find(isnew)},' subject ',num2str(nsub),'. Please repeat first-level analyses']); return; end
        if nanalyses==1, REDO=[]; n=0; N=CONN_x.Setup.nsubjects*nconditions*nrois*length(analyses); nroisbak=nrois; 
        else N=N-CONN_x.Setup.nsubjects*nconditions*nroisbak+CONN_x.Setup.nsubjects*nconditions*nrois; end
        
        clear Yout;
        for ncondition=1:nconditions,
            for nroi=1:nrois,
                for nsub=1:CONN_x.Setup.nsubjects,
                    filename=fullfile(filepathresults,['BETA_Subject',num2str(nsub),'_Condition',num2str(ncondition,'%03d'),'_Source',num2str(iroi(nroi),'%03d'),'.nii']);
                    if isempty(REDO)&&~(isnew(nroi)||isempty(dir(filename))),
                        if isfield(CONN_x,'gui')&&isstruct(CONN_x.gui)&&isfield(CONN_x.gui,'overwrite'), REDO=CONN_x.gui.overwrite; else, REDO=questdlg('Overwrite existing subject results?','','Yes', 'No', 'Yes');end;
                    end
                    if strcmp(REDO,'Yes')||(isnew(nroi)||isempty(dir(filename))),
                        filename=fullfile(filepathresults,['resultsDATA_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Source',num2str(iroi(nroi),'%03d'),'.mat']);
                        Yout=conn_vol(filename);
                        t=nan+zeros(Yout.matdim.dim);
                        y=conn_get_time(Yout,1,[],false);%nsub);
                        %V0=spm_vol(deblank(CONN_x.Setup.functional{nsub}{1}{1}(1,:))); V0=V0(1);
                        %V=spm_vol(deblank(CONN_x.Setup.structural{nsub}{1})); V=V(1);
                        V=CONN_x.Setup.structural{nsub}{3}; V=V(1);
                        t(Yout.voxels)=y;
                        V.fname=fullfile(filepathresults,['BETA_Subject',num2str(nsub),'_Condition',num2str(ncondition,'%03d'),'_Source',num2str(iroi(nroi),'%03d'),'.nii']);
                        if isfield(V,'dt'), V.dt=[spm_type('float32') spm_platform('bigend')];
                        elseif length(V.dim)>3, V.dim(4)=spm_type('float32'); end
                        spm_write_vol(V,t);
                        if isfield(CONN_x.Setup,'outputfiles')&&numel(CONN_x.Setup.outputfiles)>=3&&CONN_x.Setup.outputfiles(3),
                            V.fname=fullfile(filepathresults,['corr_Subject',num2str(nsub),'_Condition',num2str(ncondition,'%03d'),'_Source',num2str(iroi(nroi),'%03d'),'.nii']);
                            t=tanh(t);
                            spm_write_vol(V,t);
                        end
                    end
                    n=n+1;
                    conn_waitbar(n/N,h);
                end
            end
        end
        CONN_x.Analyses(ianalysis).sources=names;
        fileout=fullfile(filepathresults,'_list_sources.txt');
        fh=fopen(fileout,'wt');
        for n1=1:length(CONN_x.Analyses(ianalysis).sourcenames),fprintf(fh,'Source%03d = %s\n',n1,CONN_x.Analyses(ianalysis).sourcenames{n1});end
        fclose(fh);
        fileout=fullfile(filepathresults,'_list_conditions.txt');
        fh=fopen(fileout,'wt');
        for n1=1:nconditions,fprintf(fh,'Condition%03d = %s\n',n1,CONN_x.Setup.conditions.names{n1});end
        fclose(fh);
    end
    CONN_x.Analysis=analysisbak;
    conn_waitbar('close',h); ;
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creates BETA_Subject###_Condition###_Measure###.nii files (first-level voxel-to-voxel analyses)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if any(options==13) && any(CONN_x.Setup.steps([3])) && (nargin<=1||any(varargin{1}==0)),
    [path,name,ext]=fileparts(CONN_x.filename);
    filepath=CONN_x.folders.preprocessing;
    filepathresults=CONN_x.folders.firstlevel;
    nconditions=length(CONN_x.Setup.conditions.names)-1;
    REDO=[]; N=0;n=0;
    h=conn_waitbar(0,['Step ',num2str(sum(options<=13)),'/',num2str(length(options)),': Voxel-to-voxel first-level analyses']);
    measures=CONN_x.vvAnalyses.regressors;
    [nill,idx]=sort(cat(1,measures.localsupport{:}));mfieldnames=fieldnames(measures);for nfieldnames=1:numel(mfieldnames), measures.(mfieldnames{nfieldnames})=measures.(mfieldnames{nfieldnames})(idx); end % make analyses with same kernel size consecutive for speed improvemnet (using conn_v2v local storage)
    [measuretypes,idx]=sort(cat(1,measures.measuretype{:}));mfieldnames=fieldnames(measures);for nfieldnames=1:numel(mfieldnames), measures.(mfieldnames{nfieldnames})=measures.(mfieldnames{nfieldnames})(idx); end 
    nmeasures=numel(measures.names);
    nmeasures2=sum(measuretypes==2);
    nmeasures3=sum(measuretypes==3);
    nmeasures1=nmeasures-nmeasures2-nmeasures3;    
    imeasure=[];isnew=[];for nmeasure=1:nmeasures,[imeasure(nmeasure),isnew(nmeasure)]=conn_v2v('match_measures',measures,nmeasure,'+');end
    
    if nmeasures1>0
        for nsub=1:CONN_x.Setup.nsubjects,
            for ncondition=1:nconditions,
                for nmeasure=1:nmeasures1,
                    filename=fullfile(filepathresults,['BETA_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Measure',num2str(imeasure(nmeasure),'%03d'),'_Component',num2str(1,'%03d'),'.nii']);
                    isnew(nmeasure)=isnew(nmeasure)|isempty(dir(filename));
                end
                if isempty(REDO)&&~all(isnew(1:nmeasures1)),
                    if isfield(CONN_x,'gui')&&isstruct(CONN_x.gui)&&isfield(CONN_x.gui,'overwrite'), REDO=CONN_x.gui.overwrite; else, REDO=questdlg('Overwrite existing subject results?','','Yes', 'No', 'Yes');end;
                end
                if strcmp(REDO,'Yes')||any(isnew(1:nmeasures1)),
                    %filename_B1=fullfile(filepath,['vvPC_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.nii']);
                    %Y1=spm_vol(filename_B1);
                    filename_B1=fullfile(filepath,['vvPC_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
                    Y1=conn_vol(filename_B1);
                    filename_D1=fullfile(filepath,['vvPCeig_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
                    D1=load(filename_D1,'D');
                    %if ~N, N=(CONN_x.Setup.nsubjects-nsub+1)*nconditions*numel(Y1); numelY1bak=numel(Y1);
                    %else, N=N-numelY1bak+numel(Y1);end
                    if ~N, N=(CONN_x.Setup.nsubjects-nsub+1)*nconditions*Y1.size.Nt; numelY1bak=Y1.size.Nt;
                    else, N=N-numelY1bak+Y1.size.Nt;end
                    
                    params=cell(1,nmeasures1);
                    for nmeasure=1:nmeasures1,
                        if strcmp(REDO,'Yes')||isnew(nmeasure)
                            params{nmeasure}=conn_v2v('compute_start',measures,nmeasure,Y1.matdim.mat);
                        end
                    end
                    %[gridx,gridy,gridz]=ndgrid(1:Y1(1).dim(1),1:Y1(1).dim(2),1:Y1(1).dim(3));xyz=[gridx(:),gridy(:),gridz(:),ones(numel(gridx),1)]';
                    for ndim=1:Y1.size.Nt,%numel(Y1),
                        doneread=0;
                        for nmeasure=1:nmeasures1,
                            if (strcmp(REDO,'Yes')||isnew(nmeasure))&&ndim<=params{nmeasure}.dimensions_in,
                                if ~doneread
                                    y1=conn_get_time(Y1,ndim);
                                    %y1=reshape(spm_get_data(Y1(ndim),xyz),Y1(1).dim); %y1=spm_read_vols(Y1(ndim));
                                    doneread=1;
                                end
                                params{nmeasure}=conn_v2v('compute_step',params{nmeasure},y1,D1.D(ndim));
                            end
                        end
                        n=n+1;
                        conn_waitbar(n/N,h);
                    end
                    for nmeasure=1:nmeasures1,
                        if strcmp(REDO,'Yes')||isnew(nmeasure)
                            d=conn_v2v('compute_end',params{nmeasure});
                            if iscell(d)
                                dsum=0;
                                for nout=1:numel(d)
                                    filename=fullfile(filepathresults,['BETA_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Measure',num2str(imeasure(nmeasure),'%03d'),'_Component',num2str(nout,'%03d'),'.nii']);
                                    Yout=struct('fname',filename,'mat',Y1.matdim.mat,'dim',Y1.matdim.dim,'n',[1,1],'pinfo',[1;0;0],'dt',[spm_type('float32'),spm_platform('bigend')],'descrip',mfilename);
                                    %Yout=Y1(1);Yout.fname=filename;
                                    spm_write_vol(Yout,d{nout});
                                    dsum=dsum+abs(d{nout}).^2;
                                end
                                if numel(d)>1
                                    dsum=sqrt(dsum);
                                    filename=fullfile(filepathresults,['BETA_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Measure',num2str(imeasure(nmeasure),'%03d'),'_Component',num2str(0,'%03d'),'.nii']);
                                    Yout=struct('fname',filename,'mat',Y1.matdim.mat,'dim',Y1.matdim.dim,'n',[1,1],'pinfo',[1;0;0],'dt',[spm_type('float32'),spm_platform('bigend')],'descrip',mfilename);
                                    %Yout=Y1(1);Yout.fname=filename;
                                    spm_write_vol(Yout,dsum);
                                end
                            else
                                filename=fullfile(filepathresults,['BETA_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Measure',num2str(imeasure(nmeasure),'%03d'),'_Component',num2str(1,'%03d'),'.nii']);
                                Yout=struct('fname',filename,'mat',Y1.matdim.mat,'dim',Y1.matdim.dim,'n',[1,1],'pinfo',[1;0;0],'dt',[spm_type('float32'),spm_platform('bigend')],'descrip',mfilename);
                                %Yout=Y1(1);Yout.fname=filename;
                                spm_write_vol(Yout,d);
                            end
                        end
                    end
                end
            end
        end
    end
    conn_waitbar('close',h);
    
    if nmeasures2>0,
        MAXDIMS=256;
        h=conn_waitbar(0,['Step ',num2str(sum(options<=13)),'/',num2str(length(options)),': connectome-level MVPA analyses']);
        N=nconditions*nmeasures2;
        n=0;
        for ncondition=1:nconditions,
            for nmeasure=nmeasures1+(1:nmeasures2),
                filename=fullfile(filepathresults,['BETA_Subject',num2str(CONN_x.Setup.nsubjects,'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Measure',num2str(imeasure(nmeasure),'%03d'),'_Component',num2str(1,'%03d'),'.nii']);
                isnew(nmeasure)=isnew(nmeasure)|isempty(dir(filename));
            end
        end
        if isempty(REDO)&&~all(isnew(nmeasures1+(1:nmeasures2))),
            if isfield(CONN_x,'gui')&&isstruct(CONN_x.gui)&&isfield(CONN_x.gui,'overwrite'), REDO=CONN_x.gui.overwrite; else, REDO=questdlg('Overwrite existing subject results?','','Yes', 'No', 'Yes');end;
        end
        if strcmp(REDO,'Yes')||any(isnew(nmeasures1+(1:nmeasures2))),
            %             filename_D1=fullfile(filepath,['vvPCcov_SubjectA',num2str(1,'%03d'),'_SubjectB',num2str(1,'%03d'),'_ConditionA',num2str(ncondition,'%03d'),'_ConditionB',num2str(ncondition,'%03d'),'.mat']);
            %             D1=load(filename_D1,'D');
            %                 filename_B1=fullfile(filepath,['vvPC_Subject',num2str(1,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.nii']);
            %                 Y1=spm_vol(filename_B1);
            %                 sA=prod(Y1(1).dim);
            %                 [gridx,gridy,gridz]=ndgrid(1:Y1(1).dim(1),1:Y1(1).dim(2),1:Y1(1).dim(3));xyz=[gridx(:),gridy(:),gridz(:),ones(numel(gridx),1)]';
            filename_B1=fullfile(filepath,['vvPC_Subject',num2str(1,'%03d'),'_Condition',num2str(1,'%03d'),'.mat']);
            Y1=conn_vol(filename_B1);
            sA=prod(Y1.matdim.dim);
            for nmeasure=nmeasures1+(1:nmeasures2),
                if strcmp(REDO,'Yes')||isnew(nmeasure)
                    Y1Nt=zeros(CONN_x.Setup.nsubjects,nconditions);
                    for nsub=1:CONN_x.Setup.nsubjects
                        for ncondition=1:nconditions,
                            filename=fullfile(filepath,['vvPC_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
                            Yout=conn_vol(filename);
                            if ~isequal(Y1.matdim.dim,Yout.matdim.dim) || ~isequal(Y1.voxels,Yout.voxels), error('unequal analysis voxels across subjects'); end
                            Y1Nt(nsub,ncondition)=Yout.size.Nt;
                        end
                    end
                    NdimsIn=min(measures.dimensions_in{nmeasure},max(Y1Nt(:))); 
                    
                    h2=conn_waitbar(0,['computing subject x subject covariance']);
                    C=0;
                    for slice=1:Y1.size.Ns,
                        for nsub=1:CONN_x.Setup.nsubjects
                            for ncondition=1:nconditions,
                                Y1.fname=fullfile(filepath,['vvPC_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
                                Y1.size.Nt=Y1Nt(nsub,ncondition);
                                temp=conn_get_slice(Y1,slice);
                                if nsub==1&&ncondition==1, x=zeros([size(temp,2),NdimsIn,CONN_x.Setup.nsubjects,nconditions]); end
                                if ~isempty(temp)
                                    x(:,1:min(size(temp,1),NdimsIn),nsub,ncondition)=temp(1:min(size(temp,1),NdimsIn),:)';
                                end
                            end
                        end
                        x=x(:,:);
                        C=C+x'*x;
                        conn_waitbar(slice/Y1.size.Ns,h2);
                    end
                    close(h2);
                    
                    filename=fullfile(filepathresults,['TEMPORAL1_Measure',num2str(imeasure(nmeasure),'%03d'),'.mat']);
                    save(filename,'C');
                    C=permute(reshape(C,[NdimsIn,CONN_x.Setup.nsubjects,nconditions,NdimsIn,CONN_x.Setup.nsubjects,nconditions]),[1,4,2,3,5,6]);
                    h2=conn_waitbar(0,['computing MVPA components']);
                    filename=fullfile(filepathresults,['TEMPORAL2_Measure',num2str(imeasure(nmeasure),'%03d'),'.mat']);
                    NdimsOut=min(CONN_x.Setup.nsubjects*nconditions,measures.dimensions_out{nmeasure});
                    Yout=Y1; Yout.fname=filename;Yout.size.Nt=CONN_x.Setup.nsubjects*nconditions*NdimsOut;
                    Yout=conn_init_vol(Yout);
                    for slice=1:Y1.size.Ns,
                        for nsub=1:CONN_x.Setup.nsubjects
                            for ncondition=1:nconditions,
                                Y1.fname=fullfile(filepath,['vvPC_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
                                Y1.size.Nt=Y1Nt(nsub,ncondition);
                                temp=conn_get_slice(Y1,slice);
                                if nsub==1&&ncondition==1, x=zeros([size(temp,2),NdimsIn,CONN_x.Setup.nsubjects,nconditions]); end
                                if ~isempty(temp)
                                    x(:,1:min(size(temp,1),NdimsIn),nsub,ncondition)=temp(1:min(size(temp,1),NdimsIn),:)';
                                end
                            end
                        end
                        c=zeros([Y1.size.Nv(slice),repmat([CONN_x.Setup.nsubjects,nconditions],[1,2])]);
                        for nsub=1:CONN_x.Setup.nsubjects
                            for ncondition=1:nconditions,
                                for nsub2=1:CONN_x.Setup.nsubjects
                                    for ncondition2=1:nconditions,
                                        c(:,nsub,ncondition,nsub2,ncondition2)=sum((x(:,:,nsub)*C(:,:,nsub,ncondition,nsub2,ncondition2)).*x(:,:,nsub2),2);
                                    end
                                end
                            end
                        end
                        x=zeros([CONN_x.Setup.nsubjects*nconditions,NdimsOut,Y1.size.Nv(slice)]); 
                        %nvox0=sum(Y1.size.Nv(1:slice-1));
                        for nvox=1:Y1.size.Nv(slice),
                            c1=reshape(c(nvox,:),CONN_x.Setup.nsubjects*nconditions*[1,1]);
                            c1=bsxfun(@minus,c1,mean(c1,1));
                            c1=bsxfun(@minus,c1,mean(c1,2));
                            [Q,D]=svd(c1);
                            d=diag(D);
                            Q=Q(:,1:NdimsOut);
                            d=sqrt(abs(d(1:NdimsOut)));
                            %doflip=sum(Q,1)<0;
                            %d(doflip)=-d(doflip);
                            Q=bsxfun(@times,Q,d');
                            x(:,:,nvox)=Q;
                            %conn_write_voxel(Yout,Q,nvox0+nvox);
                        end
                        conn_write_slice(Yout,reshape(x,[CONN_x.Setup.nsubjects*nconditions*NdimsOut,Y1.size.Nv(slice)]),slice);
                        conn_waitbar(slice/Y1.size.Ns,h2);
                    end
                    close(h2);
                    
                    h2=conn_waitbar(0,['creating MVPA score volumes']);
                    for nsub=1:CONN_x.Setup.nsubjects
                        for ncondition=1:nconditions,
                            dsum=0;
                            for ndim=1:NdimsOut
                                x=conn_get_time(Yout,sub2ind([CONN_x.Setup.nsubjects,nconditions,NdimsOut],nsub,ncondition,ndim));
                                filename=fullfile(filepathresults,['BETA_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Measure',num2str(imeasure(nmeasure),'%03d'),'_Component',num2str(ndim,'%03d'),'.nii']);
                                a=struct('fname',filename,'mat',Yout.matdim.mat,'dim',Yout.matdim.dim,'n',[1,1],'pinfo',[1;0;0],'dt',[spm_type('float32'),spm_platform('bigend')],'descrip',mfilename);
                                spm_write_vol(a,x);
                                dsum=dsum+abs(x).^2;
                            end
                            filename=fullfile(filepathresults,['BETA_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Measure',num2str(imeasure(nmeasure),'%03d'),'_Component',num2str(0,'%03d'),'.nii']);
                            a=struct('fname',filename,'mat',Yout.matdim.mat,'dim',Yout.matdim.dim,'n',[1,1],'pinfo',[1;0;0],'dt',[spm_type('float32'),spm_platform('bigend')],'descrip',mfilename);
                            spm_write_vol(a,sqrt(dsum));
                        end
                        conn_waitbar(nsub/CONN_x.Setup.nsubjects,h2);
                    end
                    close(h2);
%                     filename={fullfile(filepathresults,['TEMPORAL1_Measure',num2str(imeasure(nmeasure),'%03d'),'.mat']),...
%                               fullfile(filepathresults,['TEMPORAL2_Measure',num2str(imeasure(nmeasure),'%03d'),'.mat']),...
%                               fullfile(filepathresults,['TEMPORAL2_Measure',num2str(imeasure(nmeasure),'%03d'),'.matc'])};
%                     spm_unlink(filename{:});
                end
                n=n+1;
                conn_waitbar(n/N,h);
            end
        else
            n=n+nmeasures2;
            conn_waitbar(n/N,h);
        end
        conn_waitbar('close',h);
    end
    
%     if nmeasures2>0,
%         MAXDIMS=256;
%         h=conn_waitbar(0,['Step ',num2str(sum(options<=13)),'/',num2str(length(options)),': connectome-level MVPA analyses']);
%         N=nconditions*nmeasures2;
%         n=0;
%         for ncondition=1:nconditions,
%             for nmeasure=nmeasures1+(1:nmeasures2),
%                 filename=fullfile(filepathresults,['BETA_Subject',num2str(CONN_x.Setup.nsubjects,'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Measure',num2str(imeasure(nmeasure),'%03d'),'_Component',num2str(1,'%03d'),'.nii']);
%                 isnew(nmeasure)=isnew(nmeasure)|isempty(dir(filename));
%             end
%         end
%         if isempty(REDO)&&~all(isnew(nmeasures1+(1:nmeasures2))),
%             if isfield(CONN_x,'gui')&&isstruct(CONN_x.gui)&&isfield(CONN_x.gui,'overwrite'), REDO=CONN_x.gui.overwrite; else, REDO=questdlg('Overwrite existing subject results?','','Yes', 'No', 'Yes');end;
%         end
%         if strcmp(REDO,'Yes')||any(isnew(nmeasures1+(1:nmeasures2))),
%             %             filename_D1=fullfile(filepath,['vvPCcov_SubjectA',num2str(1,'%03d'),'_SubjectB',num2str(1,'%03d'),'_ConditionA',num2str(ncondition,'%03d'),'_ConditionB',num2str(ncondition,'%03d'),'.mat']);
%             %             D1=load(filename_D1,'D');
%             %                 filename_B1=fullfile(filepath,['vvPC_Subject',num2str(1,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.nii']);
%             %                 Y1=spm_vol(filename_B1);
%             %                 sA=prod(Y1(1).dim);
%             %                 [gridx,gridy,gridz]=ndgrid(1:Y1(1).dim(1),1:Y1(1).dim(2),1:Y1(1).dim(3));xyz=[gridx(:),gridy(:),gridz(:),ones(numel(gridx),1)]';
%             filename_B1=fullfile(filepath,['vvPC_Subject',num2str(1,'%03d'),'_Condition',num2str(1,'%03d'),'.mat']);
%             Y1=conn_vol(filename_B1);
%             sA=prod(Y1.matdim.dim);
%             for nmeasure=nmeasures1+(1:nmeasures2),
%                 if strcmp(REDO,'Yes')||isnew(nmeasure)
%                     opts=struct('issym',true,'isreal',true);
%                     [y,d]=eigs(@(x)conn_v2v('compute_Ax',x,CONN_x.folders.preprocessing,CONN_x.Setup.nsubjects,1:nconditions,measures.dimensions_in{nmeasure}),sA,measures.dimensions_out{nmeasure},'LM',opts);
%                     
%                     dsum=0;
%                     for ndim=1:measures.dimensions_out{nmeasure},
%                         filename=fullfile(filepathresults,['BETA_Measure',num2str(imeasure(nmeasure),'%03d'),'_Component',num2str(ndim,'%03d'),'.nii']);
%                         Yout=struct('fname',filename,'mat',Y1.matdim.mat,'dim',Y1.matdim.dim,'n',[1,1],'pinfo',[1;0;0],'dt',[spm_type('float32'),spm_platform('bigend')],'descrip',mfilename);
%                         %Yout=Y1(1);Yout.fname=filename;
%                         spm_write_vol(Yout,reshape(y(:,ndim),Y1.matdim.dim));
%                         dsum=dsum+abs(y(:,ndim)).^2;
%                     end
%                     filename=fullfile(filepathresults,['BETA_Measure',num2str(imeasure(nmeasure),'%03d'),'_Component',num2str(0,'%03d'),'.nii']);
%                     Yout=struct('fname',filename,'mat',Y1.matdim.mat,'dim',Y1.matdim.dim,'n',[1,1],'pinfo',[1;0;0],'dt',[spm_type('float32'),spm_platform('bigend')],'descrip',mfilename);
%                     %Yout=Y1(1);Yout.fname=filename;
%                     spm_write_vol(Yout,reshape(sqrt(dsum),Y1.matdim.dim));
%                     filename=fullfile(filepathresults,['BETAeig_Measure',num2str(imeasure(nmeasure),'%03d'),'_Component',num2str(0,'%03d'),'.mat']);
%                     D=d;Ndim=measures.dimensions_out{nmeasure};save(filename,'D','Ndim');
%                     
% 
%                     filename=fullfile(filepathresults,['TEMPORAL1_Measure',num2str(imeasure(nmeasure),'%03d'),'.mat']);
%                     Y2=Y1; Y2.fname=filename;Y2.size.Nt=CONN_x.Setup.nsubjects*nconditions*measures.dimensions_out{nmeasure};
%                     Y2=conn_init_vol(Y2);
%                     for nsub=1:CONN_x.Setup.nsubjects
% disp([1,nsub])                        
%                         for ncondition=1:nconditions,
% %                             filename_B1=fullfile(filepath,['vvPC_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.nii']);
% %                             Y1=spm_vol(filename_B1);
%                             filename_B1=fullfile(filepath,['vvPC_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
%                             Y1=conn_vol(filename_B1);
%                             dsum=0;
%                             for ndim=1:measures.dimensions_out{nmeasure},
%                                 fprintf('.');
%                                 z=0;
%                                 for ncomp=1:measures.dimensions_in{nmeasure},
%                                     x=conn_get_time(Y1,ncomp); %%%
%                                     %x=spm_get_data(Y1(ncomp),xyz);
%                                     z=z+x(:)*(x(:)'*y(:,ndim));
%                                 end
%                                 conn_write_time(Y2,z(Y2.voxels),sub2ind([CONN_x.Setup.nsubjects,nconditions,measures.dimensions_out{nmeasure}],nsub,ncondition,ndim));
%                             end
%                             fprintf('\n');
%                         end
%                     end
%                     filename=fullfile(filepathresults,['TEMPORAL2_Measure',num2str(imeasure(nmeasure),'%03d'),'.mat']);
%                     Ndims=min(MAXDIMS,min(CONN_x.Setup.nsubjects*nconditions,measures.dimensions_out{nmeasure}));
%                     Yout=Y1; Yout.fname=filename;Yout.size.Nt=CONN_x.Setup.nsubjects*nconditions*Ndims;
%                     Yout=conn_init_vol(Yout);
%                     for nvox=1:numel(Y2.voxels)
%                         x=reshape(conn_get_voxel(Y2,nvox),[CONN_x.Setup.nsubjects*nconditions,measures.dimensions_out{nmeasure}]);
%                         [Q,D]=svd(x);
%                         conn_write_voxel(Yout,Q*D,nvox);
%                     end
%                     for nsub=1:CONN_x.Setup.nsubjects
% disp([2,nsub])                        
%                         for ncondition=1:nconditions,
%                             dsum=0;
%                             for ndim=1:Ndims
%                                 x=conn_get_time(Yout,sub2ind([CONN_x.Setup.nsubjects,nconditions,Ndims],nsub,ncondition,ndim));
%                                 filename=fullfile(filepathresults,['BETA_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Measure',num2str(imeasure(nmeasure),'%03d'),'_Component',num2str(ndim,'%03d'),'.nii']);
%                                 Yout=struct('fname',filename,'mat',Yout.matdim.mat,'dim',Yout.matdim.dim,'n',[1,1],'pinfo',[1;0;0],'dt',[spm_type('float32'),spm_platform('bigend')],'descrip',mfilename);
%                                 spm_write_vol(Yout,x);
%                                 dsum=dsum+abs(x).^2;
%                             end
%                             filename=fullfile(filepathresults,['BETA_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Measure',num2str(imeasure(nmeasure),'%03d'),'_Component',num2str(0,'%03d'),'.nii']);
%                             Yout=struct('fname',filename,'mat',Yout.matdim.mat,'dim',Yout.matdim.dim,'n',[1,1],'pinfo',[1;0;0],'dt',[spm_type('float32'),spm_platform('bigend')],'descrip',mfilename);
%                             spm_write_vol(Yout,sqrt(dsum));
%                         end
%                     end
%                     filename={fullfile(filepathresults,['TEMPORAL1_Measure',num2str(imeasure(nmeasure),'%03d'),'.mat']),...
%                               fullfile(filepathresults,['TEMPORAL1_Measure',num2str(imeasure(nmeasure),'%03d'),'.matc']),...
%                               fullfile(filepathresults,['TEMPORAL2_Measure',num2str(imeasure(nmeasure),'%03d'),'.mat']),...
%                               fullfile(filepathresults,['TEMPORAL2_Measure',num2str(imeasure(nmeasure),'%03d'),'.matc'])};
%                     spm_unlink(filename{:});
%                 end
%                 n=n+1;
%                 conn_waitbar(n/N,h);
%             end
%         else
%             n=n+nmeasures2;
%             conn_waitbar(n/N,h);
%         end
%         conn_waitbar('close',h);
%     end
    
%     if nmeasures3>0,
%         h=conn_waitbar(0,['Step ',num2str(sum(options<=13)),'/',num2str(length(options)),': group-level MVPA analyses']);
%         N=nconditions*nmeasures3;
%         n=0;
%         for ncondition=1:nconditions,
%             for nmeasure=nmeasures1+(1:nmeasures3),
%                 filename=fullfile(filepathresults,['BETA_Subject',num2str(CONN_x.Setup.nsubjects,'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Measure',num2str(imeasure(nmeasure),'%03d'),'_Component',num2str(1,'%03d'),'.nii']);
%                 isnew(nmeasure)=isnew(nmeasure)|isempty(dir(filename));
%             end
%         end
%         if isempty(REDO)&&~all(isnew(nmeasures1+(1:nmeasures3))),
%             if isfield(CONN_x,'gui')&&isstruct(CONN_x.gui)&&isfield(CONN_x.gui,'overwrite'), REDO=CONN_x.gui.overwrite; else, REDO=questdlg('Overwrite existing subject results?','','Yes', 'No', 'Yes');end;
%         end
%         if strcmp(REDO,'Yes')||any(isnew(nmeasures1+(1:nmeasures3))),
%             %             filename_D1=fullfile(filepath,['vvPCcov_SubjectA',num2str(1,'%03d'),'_SubjectB',num2str(1,'%03d'),'_ConditionA',num2str(ncondition,'%03d'),'_ConditionB',num2str(ncondition,'%03d'),'.mat']);
%             %             D1=load(filename_D1,'D');
%             filename_B1=fullfile(filepath,['vvPC_Subject',num2str(1,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.nii']);
%             Y1=spm_vol(filename_B1);
%             sA=prod(Y1(1).dim);
%             [gridx,gridy,gridz]=ndgrid(1:Y1(1).dim(1),1:Y1(1).dim(2),1:Y1(1).dim(3));xyz=[gridx(:),gridy(:),gridz(:),ones(numel(gridx),1)]';
%             for nmeasure=nmeasures1+(1:nmeasures3),
%                 if strcmp(REDO,'Yes')||isnew(nmeasure)
%                     
%                     for nvoxel=1:numel(gridx),
%                         C=zeros([CONN_x.Setup.nsubjects,nconditions,CONN_x.Setup.nsubjects,nconditions]);
%                         for nsub=1:CONN_x.Setup.nsubjects
%                             for ncondition=1:nconditions,
%                                 for nsub2=1:nsub
%                                     for ncondition2=1:ncondition,
%                                         C(nsub,ncondition,nsub2,ncondition2)
%                                     end
%                                 end
%                             end
%                         end
%                     end
%                             
%                         end
%                         opts=struct('issym',true,'isreal',true);
%                         [y,d]=eigs(@(x)conn_v2v('compute_Ax',x,CONN_x.folders.preprocessing,CONN_x.Setup.nsubjects,ncondition,measures.dimensions_in{nmeasure}),sA,measures.dimensions_out{nmeasure},'LM',opts);
%                         
%                         dsum=0;
%                         for ndim=1:measures.dimensions_out{nmeasure},
%                             filename=fullfile(filepathresults,['BETA_Condition',num2str(ncondition,'%03d'),'_Measure',num2str(imeasure(nmeasure),'%03d'),'_Component',num2str(ndim,'%03d'),'.nii']);
%                             Yout=Y1(1);Yout.fname=filename;
%                             spm_write_vol(Yout,reshape(y(:,ndim),Y1(1).dim));
%                             dsum=dsum+abs(y(:,ndim)).^2;
%                         end
%                         filename=fullfile(filepathresults,['BETA_Condition',num2str(ncondition,'%03d'),'_Measure',num2str(imeasure(nmeasure),'%03d'),'_Component',num2str(0,'%03d'),'.nii']);
%                         Yout=Y1(1);Yout.fname=filename;
%                         spm_write_vol(Yout,reshape(sqrt(dsum),Y1(1).dim));
%                         for nsub=1:CONN_x.Setup.nsubjects
%                             filename_B1=fullfile(filepath,['vvPC_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.nii']);
%                             Y1=spm_vol(filename_B1);
%                             dsum=0;
%                             for ndim=1:measures.dimensions_out{nmeasure},
%                                 fprintf('.');
%                                 z=0;
%                                 for ncomp=1:measures.dimensions_in{nmeasure},
%                                     x=spm_get_data(Y1(ndim),xyz);
%                                     z=z+x*(x*y(:,ndim));
%                                 end
%                                 filename=fullfile(filepathresults,['BETA_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Measure',num2str(imeasure(nmeasure),'%03d'),'_Component',num2str(ndim,'%03d'),'.nii']);
%                                 Yout=Y1(1);Yout.fname=filename;
%                                 spm_write_vol(Yout,reshape(z,Y1(1).dim));
%                                 dsum=dsum+abs(z).^2;
%                             end
%                             fprintf('\n');
%                         end
%                         filename=fullfile(filepathresults,['BETA_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Measure',num2str(imeasure(nmeasure),'%03d'),'_Component',num2str(0,'%03d'),'.nii']);
%                         Yout=Y1(1);Yout.fname=filename;
%                         spm_write_vol(Yout,reshape(sqrt(dsum),Y1(1).dim));
%                         
%                         
%                         
%                     end
%                     n=n+1;
%                     conn_waitbar(n/N,h);
%                 end
%             else
%                 n=n+nmeasures3;
%                 conn_waitbar(n/N,h);
%             end
%         end
%         conn_waitbar('close',h);
%     end

    CONN_x.vvAnalyses.measures=conn_v2v('list_extended',CONN_x.vvAnalyses.regressors);
    fileout=fullfile(filepathresults,'_list_measures.txt');
    fh=fopen(fileout,'wt');
    for n1=1:length(CONN_x.vvAnalyses.measurenames),fprintf(fh,'Measure%03d = %s\n',n1,CONN_x.vvAnalyses.measurenames{n1});end
    fclose(fh);
    fileout=fullfile(filepathresults,'_list_conditions.txt');
    fh=fopen(fileout,'wt');
    for n1=1:nconditions,fprintf(fh,'Condition%03d = %s\n',n1,CONN_x.Setup.conditions.names{n1});end
    fclose(fh);
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creates resultsDATA_Condition###_Source###.mat files (combined first-level analyses)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if 0,%any(options==13) && any(CONN_x.Setup.steps([2])),
    if ~isfield(CONN_x.Setup,'normalized'), CONN_x.Setup.normalized=1; end
    if ~CONN_x.Setup.normalized,
        disp(['Not spatially-normalized data. Skipping ROI-to-voxel second-level analyses']);
    else,
        [path,name,ext]=fileparts(CONN_x.filename);
        filepath=CONN_x.folders.preprocessing;
        if nargin>1,analyses=varargin{1}; % selected analysis only
        else, analyses=1:length(CONN_x.Analyses); end;
        h=conn_waitbar(0,['Step ',num2str(sum(options<=13)),'/',num2str(length(options)),': Preparing second-level analyses']);
        analysisbak=CONN_x.Analysis;
        for nanalyses=1:length(analyses),
            ianalysis=analyses(nanalyses);
            CONN_x.Analysis=ianalysis;
            %         ianalysis=CONN_x.Analysis;
            filepathresults=fullfile(CONN_x.folders.firstlevel,CONN_x.Analyses(ianalysis).name);
            nconditions=length(CONN_x.Setup.conditions.names)-1;
            
            filename=fullfile(filepath,['ROI_Subject',num2str(1,'%03d'),'_Condition',num2str(1,'%03d'),'.mat']);
            if isempty(dir(filename)), disp(['Not ready to process step conn_process_12']); conn_waitbar('close',h);return; end
            X1=load(filename);
            [X,nill,names]=conn_designmatrix(CONN_x.Analyses(ianalysis).regressors,X1,[]);
            nrois=size(X,2)-1;
            iroi=[];isnew=[];for nroi=1:nrois,[iroi(nroi),isnew(nroi)]=conn_sourcenames(names{nroi},'-');end
            if any(isnew), error(['Non-existing ROI first-level data for ',names{find(isnew)},'. Please repeat first-level analyses']); return; end
            if nanalyses==1, N=nconditions*nrois*length(analyses);n=0; nroisbak=nrois; 
            else N=N-nconditions*nroisbak+nconditions*nrois; end
            
            for ncondition=1:nconditions,
                for nroi=1:nrois,
                    clear Yin Yout;
                    for nsub=1:CONN_x.Setup.nsubjects,
                        filename=fullfile(filepathresults,['resultsDATA_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Source',num2str(iroi(nroi),'%03d'),'.mat']);
                        Yin(nsub)=conn_vol(filename);
                    end
                    filename=fullfile(filepathresults,['resultsDATA_Condition',num2str(ncondition,'%03d'),'_Source',num2str(iroi(nroi),'%03d'),'.mat']);
                    Yout=Yin(1); Yout.fname=filename;
%                     Yout.size.Nt=CONN_x.Setup.nsubjects;
%                     Yout=conn_init_vol(Yout);
                    conn_write_combine(Yin,Yout);
                    n=n+1;
                    conn_waitbar(n/N,h);
                end
                clear Yin Yout;
                for nsub=1:CONN_x.Setup.nsubjects,
                    filename=fullfile(filepathresults,['seDATA_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
                    Yin(nsub)=conn_vol(filename);
                end
                filename=fullfile(filepathresults,['seDATA_Condition',num2str(ncondition,'%03d'),'.mat']);
                Yout=Yin(1); Yout.fname=filename;
                Yout.DOF=cat(2,Yin(:).DOF);
%                 Yout.size.Nt=CONN_x.Setup.nsubjects;
%                 Yout=conn_init_vol(Yout);
                conn_write_combine(Yin,Yout);
            end
            CONN_x.Analyses(ianalysis).sources=names;
        end
        CONN_x.Analysis=analysisbak;
        conn_waitbar('close',h);
        %CONN_x.Results.measure=CONN_x.Analyses(ianalysis).measure;
    end
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creates resultsROI_Condition###.mat files (combined first-level analyses)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if any(options==14) && any(CONN_x.Setup.steps([1])),
    [path,name,ext]=fileparts(CONN_x.filename);
    filepath=CONN_x.folders.preprocessing;
    if nargin>1,analyses=varargin{1}; % selected analysis only
    else, analyses=1:length(CONN_x.Analyses); end; 
    doanalyses=false(1,numel(analyses));
    for nanalyses=1:numel(analyses),if analyses(nanalyses)>0&&any(CONN_x.Analyses(analyses(nanalyses)).type==[1,3]), doanalyses(nanalyses)=true; end; end
    analyses=analyses(doanalyses);
    h=conn_waitbar(0,['Step ',num2str(sum(options<=14)),'/',num2str(length(options)),': Preparing second-level ROI analyses']);
    analysisbak=CONN_x.Analysis;
    for nanalyses=1:length(analyses),
        ianalysis=analyses(nanalyses);
        CONN_x.Analysis=ianalysis;
%         ianalysis=CONN_x.Analysis;
        filepathresults=fullfile(CONN_x.folders.firstlevel,CONN_x.Analyses(ianalysis).name);
        nconditions=length(CONN_x.Setup.conditions.names)-1;
        filename=fullfile(filepath,['ROI_Subject',num2str(1,'%03d'),'_Condition',num2str(1,'%03d'),'.mat']);
        if isempty(dir(filename)), disp(['Not ready to process step conn_process_13']); conn_waitbar('close',h);return; end
        X1=load(filename);
        [X,nill,names]=conn_designmatrix(CONN_x.Analyses(ianalysis).regressors,X1,[]);
        nrois=size(X,2)-1;
        [X2,nill,names2,xyz2]=conn_designmatrix({CONN_x.Analyses(ianalysis).variables,CONN_x.Analyses(ianalysis).regressors},X1,[]);
        nrois2=size(X2,2)-1;
        idxroi1roi2=zeros(1,nrois);
        for n1=1:nrois,temp=strmatch(names{n1},names2,'exact'); idxroi1roi2(n1)=temp(1);end
        X2=cat(2,X2(:,1),X2(:,1+idxroi1roi2),X2(:,1+setdiff(1:nrois2,idxroi1roi2)));
        names2=cat(2,{names2{idxroi1roi2}},{names2{setdiff(1:nrois2,idxroi1roi2)}});
        xyz=cat(2,{xyz2{idxroi1roi2}},{xyz2{setdiff(1:nrois2,idxroi1roi2)}});
        if nanalyses==1, n=0;N=CONN_x.Setup.nsubjects*nconditions*nrois*length(analyses); nroisbak=nrois; 
        else N=N-CONN_x.Setup.nsubjects*nconditions*nroisbak+CONN_x.Setup.nsubjects*nconditions*nrois; end
        
        for ncondition=1:nconditions,
            Z=zeros([nrois,nrois2,CONN_x.Setup.nsubjects]);
            xyz={};
            SE=zeros([CONN_x.Setup.nsubjects,nrois2]);
            DOF=zeros([1,CONN_x.Setup.nsubjects]);
            for nsub=1:CONN_x.Setup.nsubjects,
                filename=fullfile(filepathresults,['resultsROI_Subject',num2str(nsub,'%03d'),'_Condition',num2str(ncondition,'%03d'),'.mat']);
                t=load(filename,'Z','regressors','names','names2','xyz','SE','DOF');
                IDX=[];IDX2=[];
                for nroi=1:nrois,
                    idx=strmatch(names{nroi},t.names,'exact');
                    if isempty(idx), error(['Non-existing ROI first-level data for ',names{nroi},' subject ',num2str(nsub),'. Please repeat first-level analyses']); return; end
                    IDX(nroi)=idx(1);
                    n=n+1;
                    conn_waitbar(n/N,h);
                end
                for nroi=1:nrois2,
                    idx=strmatch(names2{nroi},t.names2,'exact');
                    if isempty(idx), error(['Non-existing ROI first-level data for ',names2{nroi},' subject ',num2str(nsub),'. Please repeat first-level analyses']); return; end
                    IDX2(nroi)=idx(1);
                end
                Z(:,:,nsub)=t.Z(IDX,IDX2);
                xyz={t.xyz{IDX2}};
                SE(nsub,:)=t.SE(IDX2);
                DOF(nsub)=t.DOF;
            end
            regressors=CONN_x.Analyses(ianalysis).regressors;
            filename=fullfile(filepathresults,['resultsROI_Condition',num2str(ncondition,'%03d'),'.mat']);
            save(filename,'Z','regressors','names','names2','xyz','SE','DOF');
        end
        CONN_x.Analyses(ianalysis).sources=names;
    end
    CONN_x.Analysis=analysisbak;
    conn_waitbar('close',h);
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creates nDATA_Condition###_Source###.mat files (normalized first-level analysis results)
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if 0,%any(options==8.5),
    [path,name,ext]=fileparts(CONN_x.filename);
    filepath=CONN_x.folders.preprocessing;
    nconditions=length(CONN_x.Setup.conditions.names)-1;
    nrois=0;for n1=1:length(CONN_x.Analyses.regressors.names), nrois=nrois+CONN_x.Analyses.regressors.dimensions{n1}(1)*(CONN_x.Analyses.regressors.deriv{n1}+1); end;
    h=conn_waitbar(0,['Step ',num2str(sum(options<=8)),'/',num2str(length(options)),': Processing functional data']);
    
    fileref=fullfile(fileparts(which('spm')),'canonical','avg152T1.nii');
    V0=spm_vol(fileref);
    clear sfile;
    for nsub=1:CONN_x.Setup.nsubjects,
        [fpath,ffile,fext]=fileparts(deblank(CONN_x.Setup.structural{nsub}{1}));
        sfile{nsub}=fullfile(fpath,[ffile,'_seg_inv_sn.mat']);
    end
    N=nconditions*nrois;
    n=0;
    for ncondition=1:nconditions,
        for nroi=1:nrois,
            filename=fullfile(filepath,['DATA_Condition',num2str(ncondition,'%03d'),'_Source',num2str(nroi,'%03d'),'.mat']);
            fileout=fullfile(filepath,['nDATA_Condition',num2str(ncondition,'%03d'),'_Source',num2str(nroi,'%03d'),'.mat']);
            Y0=conn_vol(filename);
            conn_reslice(fileout,V0(1).mat,V0(1).dim,Y0,sfile,0*CONN_x.Setup.fwhm);
            n=n+1;
            conn_waitbar(n/N,h);
        end
    end
    conn_waitbar('close',h); ;
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creates second-level SPM.mat results (second-level analysis results for SPM)
% CON_Subject### (source files for second-leve analyses)
% CON_Subject###_Source###.nii (source files for source-specific second-level analyses)
% between-subject contrasts of interest:
%    T-contrast: "connectivity results": as specified in "between subject contrast"
%    T-contrast: one per effect specified in "subject effects" (named as the corresponding second-level covariates)
%    F-contrast: "effects of interest": F- test for all effects in second-levle model
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if any(options==15) && any(CONN_x.Setup.steps([2,3])),
    if nargin>1, switch(lower(varargin{1})), 
            case 'dosingle',dosinglecontrast=1; % performs one specific analysis
            case 'doall',dosinglecontrast=0;    % one analysis per source 
            case 'readsingle', dosinglecontrast=2; % performs one speficic analysis (if it does not exist already)
            otherwise, dosinglecontrast=0; end; 
    else, dosinglecontrast=0; end
    state=2;
    if nargin>2, switch(lower(varargin{2})),
            case 'seed-to-voxel', state=2;
            case 'voxel-to-voxel', state=3;
        end
    end
    if ~isfield(CONN_x,'Results'), disp(['Not ready to process step conn_process_14']); return; end
    if state==2
        filepathresults1=fullfile(CONN_x.folders.firstlevel,CONN_x.Analyses(CONN_x.Analysis).name);
    else
        filepathresults1=CONN_x.folders.firstlevel;
    end
    filepathresults2=CONN_x.folders.secondlevel;
    if state==2
        nsources=CONN_x.Results.xX.nsources;
        csources=CONN_x.Results.xX.csources;
        sources=CONN_x.Analyses(CONN_x.Analysis).sources;
    else
        nsources=CONN_x.Results.xX.nmeasures;
        csources=CONN_x.Results.xX.cmeasures;
        sources=CONN_x.vvAnalyses.measures;
    end
    nconditions=CONN_x.Results.xX.nconditions;
    cconditions=CONN_x.Results.xX.cconditions;
    if ~isfield(CONN_x.Results.xX,'modeltype')||isempty(CONN_x.Results.xX.modeltype), CONN_x.Results.xX.modeltype=1; end; %note: obsolete 'modeltype=2' fixed-effect analyses option; remove in next release
    modeltype=CONN_x.Results.xX.modeltype;
%     if nargin>1&&varargin{1}>1, nsources=varargin{2}; csources=ones(1,length(nsources)); sources={sources{nsources}}; nsources=1:length(nsources); end
%     if nargin>1, dosinglecontrast=(varargin{1}==1); else, dosinglecontrast=length(nsources)~=1; end; %~(length(nsources)>1 & all(csources==1/length(nsources))); end
    if isfield(CONN_x.Results,'foldername')&&~isempty(CONN_x.Results.foldername),
        [ok,nill]=mkdir(filepathresults2,CONN_x.Results.foldername);
        filepathresults2=fullfile(filepathresults2,CONN_x.Results.foldername);
        CONN_x.Results.foldername=[];
    else,
        if state==2
            foldername={[CONN_x.Analyses(CONN_x.Analysis).name,'.']};
            foldername{end+1}=['SUBJECT_EFFECTS_'];
        else
            foldername={'SUBJECT_EFFECTS_'};
        end
        for n1=1:length(CONN_x.Results.xX.nsubjecteffects), 
            if ~any(diff(CONN_x.Results.xX.csubjecteffects)),foldername{end+1}=[CONN_x.Setup.l2covariates.names{CONN_x.Results.xX.nsubjecteffects(n1)},'.'];
            else, foldername{end+1}=[CONN_x.Setup.l2covariates.names{CONN_x.Results.xX.nsubjecteffects(n1)},'(',num2str(CONN_x.Results.xX.csubjecteffects(n1),'%2.1f'),')','.'];end
        end
        foldername{end+1}=['CONDITIONS_'];
        for n1=1:length(nconditions), 
            if ~any(diff(cconditions(:))),foldername{end+1}=[CONN_x.Setup.conditions.names{nconditions(n1)},'.'];
            else, foldername{end+1}=[CONN_x.Setup.conditions.names{nconditions(n1)},'(',num2str(cconditions(:,n1)','%2.1f'),')','.'];end
        end
        foldername=strcat(foldername{:});
        foldername(foldername==' '|foldername==filesep)='_';
        [ok,nill]=mkdir(filepathresults2,foldername);
        if ok,filepathresults2=fullfile(filepathresults2,foldername);
        else,filepathresults2=uigetdir(filepathresults2,'Select a directory to write the results');end
    end
    if ~ischar(filepathresults2), return; end;
%     disp(['Second-level results stored in ',filepathresults2]);

    X=zeros(CONN_x.Setup.nsubjects,length(CONN_x.Setup.l2covariates.names)-1);
    for nsub=1:CONN_x.Setup.nsubjects,
        for ncovariate=1:length(CONN_x.Setup.l2covariates.names)-1;
            X(nsub,ncovariate)=CONN_x.Setup.l2covariates.values{nsub}{ncovariate};
        end
    end
    nsubjects=find(any(X(:,CONN_x.Results.xX.nsubjecteffects)~=0,2));
    
    clear SPMall;
    cwd=pwd;
    cd(filepathresults2);
    REDUCENAMES=(state==2);
    if dosinglecontrast>0,
        foldername={};
        if state==3
            txttmp={};for n2=1:length(nsources),txttmp{end+1}=conn_v2v('pcleartext',sources{nsources(n2)}); end
            [nill,idxcharstart]=max(any(diff(double(char(txttmp)),1,1),1));
        else
            [nill,idxcharstart]=max(any(diff(double(char(sources(nsources))),1,1),1));
        end
        for n2=1:length(nsources),
            txttmp=sources{nsources(n2)};
            if state==3,txttmp=conn_v2v('pcleartext',txttmp); end
            if REDUCENAMES&&length(txttmp)>2&&strcmp(txttmp(1:3),'BA.'),
                idxtxttmp=find(txttmp=='.');idxtxttmp2=find(txttmp=='_');
                if length(idxtxttmp)>1&&length(idxtxttmp2)>1&&idxtxttmp(end)-1<idxtxttmp2(end-1), 
                    txttmp=txttmp([1:idxtxttmp(end)-1,idxtxttmp2(end-1):end]); 
                end;
            elseif n2>1&&idxcharstart>1
                txttmp=txttmp(idxcharstart:end);
            end            
            if ~any(diff(csources(:))),foldername{end+1}=[txttmp,'.'];
            else, foldername{end+1}=[txttmp,'(',num2str(csources(:,n2)','%2.1f'),')','.'];end
        end
        foldername=strcat(foldername{:});foldername(foldername==' '|foldername==filesep|foldername=='*')='_';
        [ok,nill]=mkdir(filepathresults2,foldername);
        if ok,filepathresults3{1}=fullfile(filepathresults2,foldername);
        else,filepathresults3{1}=uigetdir(filepathresults2,'Select a directory to write the results');dosinglecontrast=1;end
        if dosinglecontrast==2,
            if isempty(dir(fullfile(filepathresults3{1},'SPM.mat'))), dosinglecontrast=1;
            elseif ~(isfield(CONN_x,'gui')&&isstruct(CONN_x.gui)&&isfield(CONN_x.gui,'overwrite')), REDO=questdlg('Overwrite existing subject results?','','Yes', 'No', 'No'); if strcmp(REDO,'Yes'),dosinglecontrast=1; end; end
        end
        if dosinglecontrast==1,
            h=conn_waitbar(0,['Step ',num2str(sum(options<=15)),'/',num2str(length(options)),': Functional data second-level analyses']);
            clear SE Y;
            altestsmooth=false;
            for nsub=1:length(nsubjects),%CONN_x.Setup.nsubjects,
                if 0,%modeltype==2||((length(nsources)>1||length(nconditions)>1)&&size(csources,1)==1&&size(cconditions,1)==1),%||any(csources(:)~=1)||any(cconditions(:)~=1)),
%                     bb=0;
%                     for n1=1:length(nsources),
%                         nroi=nsources(n1);
%                         roiname=sources{nroi};
%                         if state==2
%                             [iroi,isnew]=conn_sourcenames(roiname,'-');
%                             if isnew, error(['Non-existing ROI first-level data for ',roiname,' subject ',num2str(nsubjects(nsub)),'. Please repeat first-level analyses']); return; end
%                         else
%                             [iroi,isnew,ncomp]=conn_v2v('match_extended',roiname);
%                             %[iroi,isnew]=conn_v2v('match_measures',CONN_x.vvAnalyses.regressors,nroi,'-');
%                             if isnew, error(['Non-existing voxel-to-voxel first-level data for ',roiname,' subject ',num2str(nsubjects(nsub)),'. Please repeat first-level analyses']); return; end
%                         end
%                         b=0;
%                         for n0=1:length(nconditions),
%                             ncondition=nconditions(n0);
%                             if state==2
%                                 filename=fullfile(filepathresults1,['BETA_Subject',num2str(nsubjects(nsub)),'_Condition',num2str(ncondition,'%03d'),'_Source',num2str(iroi,'%03d'),'.nii']);
%                             else
%                                 filename=fullfile(filepathresults1,['BETA_Subject',num2str(nsubjects(nsub),'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Measure',num2str(iroi,'%03d'),'_Component',num2str(ncomp,'%03d'),'.nii']);
%                             end
%                             a=spm_vol(filename);
%                             if n0==1&&n1==1&&nsub==1
%                                 [gridx,gridy,gridz]=ndgrid(1:a.dim(1),1:a.dim(2),1:a.dim(3));xyz=a.mat*[gridx(:),gridy(:),gridz(:),ones(numel(gridx),1)]'; adim=a.dim(1:3);
%                             end
%                             b=b+cconditions(n0)*reshape(spm_get_data(a,pinv(a.mat)*xyz),adim);%spm_read_vols(a);
%                             if state==2&&modeltype==2&&nsub==1,
%                                 filename=fullfile(filepathresults1,['resultsDATA_Condition',num2str(ncondition,'%03d'),'_Source',num2str(iroi,'%03d'),'.mat']);
%                                 Y(n1,n0)=conn_vol(filename);
%                                 if n1==1,
%                                     filename=fullfile(filepathresults1,['seDATA_Condition',num2str(ncondition,'%03d'),'.mat']);
%                                     SE(n0)=conn_vol(filename);
%                                 end
%                             end
%                         end
%                         bb=bb+csources(n1)*b;
%                     end
%                     filename=fullfile(filepathresults3{1},['CON_Subject',num2str(nsubjects(nsub),'%03d'),'.nii']);
%                     a.fname=filename;
%                     spm_write_vol(a,bb);
%                     filename={filename};
%                     contrast=1;
                else
                    filename={};
                    for n0=1:numel(nconditions) 
                        for n1=1:numel(nsources)
                            nroi=nsources(n1);
                            roiname=sources{nroi};
                            ncondition=nconditions(n0);
                            if state==2
                                [iroi,isnew]=conn_sourcenames(roiname,'-');
                                if isnew, error(['Non-existing seed-to-voxel first-level data for ',roiname,' subject ',num2str(nsubjects(nsub)),'. Please repeat first-level analyses']); return; end
                                tfilename=fullfile(filepathresults1,['BETA_Subject',num2str(nsubjects(nsub)),'_Condition',num2str(ncondition,'%03d'),'_Source',num2str(iroi,'%03d'),'.nii']);
                            else
                                altestsmooth=altestsmooth|~isempty(strmatch('connectome',roiname));
                                [iroi,isnew,ncomp]=conn_v2v('match_extended',roiname);
                                %[iroi,isnew]=conn_v2v('match_measures',CONN_x.vvAnalyses.regressors,nroi,'-');
                                if isnew, error(['Non-existing voxel-to-voxel first-level data for ',roiname,' subject ',num2str(nsubjects(nsub)),'. Please repeat first-level analyses']); return; end
                                tfilename=fullfile(filepathresults1,['BETA_Subject',num2str(nsubjects(nsub),'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Measure',num2str(iroi,'%03d'),'_Component',num2str(ncomp,'%03d'),'.nii']);
                            end
                            filename{n1,n0}=tfilename;
                        end
                    end
                    if numel(nconditions)>1&&size(cconditions,1)==1
                        for n1=1:numel(nsources)
                            b=0;
                            for n0=1:numel(nconditions)
                                a=spm_vol(filename{n1,n0});
                                b=b+spm_read_vols(a)*cconditions(n0);
                            end
                            tfilename=fullfile(filepathresults3{1},['CON_Subject',num2str(nsubjects(nsub),'%03d'),'_compA',num2str(n1,'%03d'),'.nii']);
                            a.fname=tfilename;
                            spm_write_vol(a,b);
                            filename{n1,numel(nconditions)+1}=tfilename;
                        end
                        filename=filename(:,end);
                        new_cconditions=1;
                    else
                        new_cconditions=cconditions;
                    end
                    if numel(nsources)>1&&size(csources,1)==1
                        for n0=1:numel(nconditions)
                            b=0;
                            for n1=1:numel(nsources)
                                a=spm_vol(filename{n1,n0});
                                b=b+spm_read_vols(a)*csources(n1);
                            end
                            tfilename=fullfile(filepathresults3{1},['CON_Subject',num2str(nsubjects(nsub),'%03d'),'_compB',num2str(n1,'%03d'),'.nii']);
                            a.fname=tfilename;
                            spm_write_vol(a,b);
                            filename{numel(nsources)+1,n0}=tfilename;
                        end
                        filename=filename(end,:);
                        new_csources=1;
                    else
                        new_csources=csources;
                    end
                    filename=filename(:);
                    contrast=kron(new_cconditions,new_csources);
                end
                
                SPMall(1).xY.VY(nsub,:)=spm_vol(char(filename))';
                SPMall(1).altestsmooth=altestsmooth;
                for n1=1:numel(filename),SPMall(1).xY.VY(nsub,n1).fname=filename{n1}; end
                if modeltype==2&&nsub==1, SPMall(1).connvols.Y=Y;SPMall(1).connvols.SE=SE;SPMall(1).connvols.cconditions=cconditions;SPMall(1).connvols.csources=csources;end
                conn_waitbar(2/4*(nsub/length(nsubjects)),h);
            end
            nrepeated=size(SPMall(1).xY.VY,2);
            SPMall(1).xX.X=kron(eye(nrepeated),X(nsubjects,CONN_x.Results.xX.nsubjecteffects));%CONN_x.Results.xX.X;
            SPMall(1).xX.name=repmat({CONN_x.Setup.l2covariates.names{CONN_x.Results.xX.nsubjecteffects}},[1,nrepeated]);%CONN_x.Results.xX.name;
            SPMall(1).xX.iH     = [];
            SPMall(1).xX.iC     = 1:size(SPMall(1).xX.X,2);
            SPMall(1).xX.iB     = [];
            SPMall(1).xX.iG     = [];
            SPMall(1).xGX       = [];
            
            if nrepeated>1
                xVi=struct('I',[repmat((1:size(SPMall(1).xY.VY,1))',[nrepeated,1]),reshape(repmat(1:nrepeated,[size(SPMall(1).xY.VY,1),1]),[],1)],'var',[0,1],'dep',[1,0]);
                SPMall(1).xVi=spm_non_sphericity(xVi);
            end
        end
    else,
        h=conn_waitbar(0,['Step ',num2str(sum(options<=15)),'/',num2str(length(options)),': Functional data second-level analyses']);
        for n1=1:length(sources),
            txttmp=sources{n1};
            if state==3,txttmp=conn_v2v('pcleartext',txttmp); end
            if REDUCENAMES&&length(txttmp)>2&&strcmp(txttmp(1:3),'BA.'),
                idxtxttmp=find(txttmp=='.');idxtxttmp2=find(txttmp=='_');
                if length(idxtxttmp)>1&&length(idxtxttmp2)>1&&idxtxttmp(end)-1<idxtxttmp2(end-1), 
                    txttmp=txttmp([1:idxtxttmp(end)-1,idxtxttmp2(end-1):end]); 
                end;
            end            
            foldername=[txttmp,'.'];
            foldername(foldername==' '|foldername==filesep|foldername=='*')='_';
            [ok,nill]=mkdir(filepathresults2,foldername);
            if ok,filepathresults3{n1}=fullfile(filepathresults2,foldername);
            else,filepathresults3{n1}=uigetdir(filepathresults2,'Select a directory to write the results');end
        end
        clear SE Y;
        for nsub=1:length(nsubjects),%CONN_x.Setup.nsubjects,
            for n1=1:length(sources),
                altestsmooth=false;
                nroi=n1;
                roiname=sources{n1};
                if state==2
                    [iroi,isnew]=conn_sourcenames(roiname,'-');
                    if isnew, error(['Non-existing ROI first-level data for ',roiname,' subject ',num2str(nsubjects(nsub)),'. Please repeat first-level analyses']); return; end
                else
                    altestsmooth=altestsmooth|~isempty(strmatch('connectome',roiname));
                    [iroi,isnew,ncomp]=conn_v2v('match_extended',roiname);
%                     [iroi,isnew]=conn_v2v('match_measures',CONN_x.vvAnalyses.regressors,nroi,'-');
                    if isnew, error(['Non-existing voxel-to-voxel first-level data for ',roiname,' subject ',num2str(nsubjects(nsub)),'. Please repeat first-level analyses']); return; end
                end
                if modeltype==2||(length(nconditions)>1&&size(cconditions,1)==1),%||any(cconditions~=1),
                    b=0;
                    for n0=1:length(nconditions),
                        ncondition=nconditions(n0);
                        if state==2
                            filename=fullfile(filepathresults1,['BETA_Subject',num2str(nsubjects(nsub)),'_Condition',num2str(ncondition,'%03d'),'_Source',num2str(iroi,'%03d'),'.nii']);
                        else
                            filename=fullfile(filepathresults1,['BETA_Subject',num2str(nsubjects(nsub),'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Measure',num2str(iroi,'%03d'),'_Component',num2str(ncomp,'%03d'),'.nii']);
                        end
                        a=spm_vol(filename);
                        b=b+cconditions(n0)*spm_read_vols(a);
%                         if n0==1&&n1==1&&nsub==1
%                             [gridx,gridy,gridz]=ndgrid(1:a.dim(1),1:a.dim(2),1:a.dim(3));xyz=a.mat*[gridx(:),gridy(:),gridz(:),ones(numel(gridx),1)]'; adim=a.dim(1:3);
%                         end
%                         b=b+cconditions(n0)*reshape(spm_get_data(a,pinv(a.mat)*xyz),adim);%spm_read_vols(a);
%                         if state==2&&modeltype==2&&nsub==1,
%                             filename=fullfile(filepathresults1,['resultsDATA_Condition',num2str(ncondition,'%03d'),'_Source',num2str(iroi,'%03d'),'.mat']);
%                             Y(n1,n0)=conn_vol(filename);
%                             if n1==1,
%                                 filename=fullfile(filepathresults1,['seDATA_Condition',num2str(ncondition,'%03d'),'.mat']);
%                                 SE(n0)=conn_vol(filename);
%                             end
%                         end
                    end
                    filename=fullfile(filepathresults3{n1},['CON_Subject',num2str(nsubjects(nsub),'%03d'),'.nii']);
                    %filename=fullfile(filepathresults2,['CON_Subject',num2str(nsubjects(nsub)),'_Source',num2str(iroi,'%03d'),'.nii']);
                    a.fname=filename;
                    spm_write_vol(a,b);
                    filename={filename};
                    contrast=1;
                else
                    filename={};
                    for n0=1:numel(nconditions)
                        ncondition=nconditions(n0);
                        if state==2
                            filename{end+1}=fullfile(filepathresults1,['BETA_Subject',num2str(nsubjects(nsub)),'_Condition',num2str(ncondition,'%03d'),'_Source',num2str(iroi,'%03d'),'.nii']);
                        else
                            filename{end+1}=fullfile(filepathresults1,['BETA_Subject',num2str(nsubjects(nsub),'%03d'),'_Condition',num2str(ncondition,'%03d'),'_Measure',num2str(iroi,'%03d'),'_Component',num2str(ncomp,'%03d'),'.nii']);
                        end
                    end
                    contrast=cconditions;
                end
                SPMall(n1).xY.VY(nsub,:)=spm_vol(char(filename))';
                SPMall(n1).altestsmooth=altestsmooth;
                if state==2&&modeltype==2&&nsub==1, SPMall(n1).connvols.Y=Y(n1,:);SPMall(n1).connvols.SE=SE;SPMall(1).connvols.cconditions=cconditions;SPMall(1).connvols.csources=1;end
            end
            conn_waitbar(2/4*(nsub/length(nsubjects)),h);
        end
        for n1=1:length(sources),
            nrepeated=size(SPMall(n1).xY.VY,2);
            SPMall(n1).xX.X=kron(eye(nrepeated),X(nsubjects,CONN_x.Results.xX.nsubjecteffects));%CONN_x.Results.xX.X;
            SPMall(n1).xX.name=repmat({CONN_x.Setup.l2covariates.names{CONN_x.Results.xX.nsubjecteffects}},[1,nrepeated]);%CONN_x.Results.xX.name;
            SPMall(n1).xX.iH     = [];
            SPMall(n1).xX.iC     = 1:size(SPMall(n1).xX.X,2);
            SPMall(n1).xX.iB     = [];
            SPMall(n1).xX.iG     = [];
            SPMall(n1).xGX       = [];
            if nrepeated>1
                xVi=struct('I',[repmat((1:size(SPMall(n1).xY.VY,1))',[nrepeated,1]),reshape(repmat(1:nrepeated,[size(SPMall(n1).xY.VY,1),1]),[],1)],'var',[0,1],'dep',[1,0]);
                SPMall(n1).xVi=spm_non_sphericity(xVi);
            end
        end
    end
    if dosinglecontrast==2,
        cd(filepathresults3{1});
        if isfield(CONN_x,'gui')&&isnumeric(CONN_x.gui)&&CONN_x.gui, conn_display('SPM.mat',1); end
        cd(cwd);
    else,
        switch(modeltype),
            case 1, % random-effects
                for n1=1:length(SPMall),
                    cd(filepathresults3{n1});
                    SPM=SPMall(n1);
                    save('SPM.mat','SPM');
                    spm('Defaults','fmri');
                    spm_unlink('mask.img');
                    SPM=spm_spm(SPM);
                    c=kron(contrast,CONN_x.Results.xX.csubjecteffects); %CONN_x.Results.xX.C;
                    cname='connectivity result';
                    if size(c,1)==1, Statname='T'; else Statname='F'; end
                    SPM.xCon = spm_FcUtil('Set',cname,Statname,'c',c',SPM.xX.xKXs);
                    if 0,%adds other contrasts (one T-test per regressor, and one "effects of interest" F-test)
                        C=eye(length(CONN_x.Results.xX.nsubjecteffects));
                        if size(C,1)>1,
                            for n2=1:size(C,1),
                                c=C(n2,:);
                                cname=CONN_x.Setup.l2covariates.names{CONN_x.Results.xX.nsubjecteffects(n2)}; %CONN_x.Results.xX.name{n2};
                                SPM.xCon(end+1) = spm_FcUtil('Set',cname,'T','c',c',SPM.xX.xKXs);
                            end
                            cname='effects of interest';
                            SPM.xCon(end+1) = spm_FcUtil('Set',cname,'F','c',C,SPM.xX.xKXs);
                        end
                    end
                    if isfield(SPM,'altestsmooth')&&SPM.altestsmooth, % modified smoothness estimation
                        SPM=conn_est_smoothness(SPM);
                        save('SPM.mat','SPM');
                    end
                    SPM=spm_contrasts(SPM,1:length(SPM.xCon));
                    save('SPM.mat','SPM');
                    if state==2&&~isempty(dir('con_0001.img')),
                        switch(CONN_x.Analyses(CONN_x.Analysis).measure),
                            case {1,2}, %correlation
                                V=spm_vol('con_0001.img');
                                t=spm_read_vols(V);
                                V.fname='corr_0001.img';
                                spm_write_vol(V,tanh(t));
                        end
                    end
                    conn_waitbar(1/2+1/2*(n1/(length(SPMall))),h);
                    
                    if isfield(CONN_x,'gui')&&isnumeric(CONN_x.gui)&&CONN_x.gui, conn_display('SPM.mat',1); end
                end
                conn_waitbar('close',h);
                cd(cwd);
            case 2, % fixed-effects
                for n1=1:length(SPMall),
                    cd(filepathresults3{n1});
                    csources=SPMall(n1).connvols.csources;
                    cconditions=SPMall(n1).connvols.cconditions;
                    Y=SPMall(n1).connvols.Y;
                    SE=SPMall(n1).connvols.SE;
                    xf=SPMall(n1).xX.X;
                    filename='CON_spmT_0001.mat';
                    Yout=Y(1); Yout.fname=filename;
                    Yout.size.Nt=1;
                    Yout.DOF=sum([SE(:).DOF]);
                    Yout=conn_init_vol(Yout);
                    for slice=1:Y(1).matdim.dim(3),
                        yf=0;
                        se.data=0;
                        se.dof=0;
                        for ncondition=1:size(Y,2),
                            for nsource=1:size(Y,1),
                                [temp,y.idx]=conn_get_slice(Y(nsource,ncondition),slice);
                                yf=yf+temp*csources(nsource)*cconditions(ncondition);
                            end;
                            [temp,nill]=conn_get_slice(SE(ncondition),slice);
                            se.data=se.data+sum(csources.^2)*(cconditions(ncondition)*temp).^2;
                            se.dof=se.dof+SE(ncondition).DOF;
                        end
                        se.data=sqrt(se.data);
                        [B,opt]=conn_glmunivariate('estimatefixed',xf,yf,se);
                        [H,F,p,dof,R]=conn_glmunivariate('evaluatefixed',opt,[],CONN_x.Results.xX.csubjecteffects); 
                        conn_write_slice(Yout,F,slice);
                        conn_waitbar(1/2+1/2*((n1-1+slice/Y(1).matdim.dim(3))/(length(SPMall))),h);
                    end
                    t=nan+zeros(Yout.matdim.dim);
                    y=conn_get_time(Yout,1,[],false);
                    %V=spm_vol(deblank(CONN_x.Setup.structural{nsub}{1})); V=V(1);
                    V=CONN_x.Setup.structural{1}{3}; V=V(1);
                    t(Yout.voxels)=y;
                    V.fname='spmT_0001.img';
                    if isfield(V,'dt'), V.dt=[spm_type('float32') spm_platform('bigend')];
                    elseif length(V.dim)>3, V.dim(4)=spm_type('float32'); end
                    spm_write_vol(V,t);
                    clear SPM;
                    SPM.xCon(1).Vspm=V;
                    SPM.xCon(1).eidf=inf;
                    SPM.xX.erdf=Yout.DOF;
                    SPM.xVol.R=[];
                    SPM.xVol.S=[];
                    save('SPM.mat','SPM');
                    
                    if isfield(CONN_x,'gui')&&isnumeric(CONN_x.gui)&&CONN_x.gui, conn_display('SPM.mat',1); end
                end
                conn_waitbar('close',h);
                cd(cwd);
        end
    end
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Creates second-level ROI.mat results
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if any(options==16) && any(CONN_x.Setup.steps([1])),
    filepathresults1=fullfile(CONN_x.folders.firstlevel,CONN_x.Analyses(CONN_x.Analysis).name);
    filepathresults2=CONN_x.folders.secondlevel;
    sources=CONN_x.Analyses(CONN_x.Analysis).sources;
    nconditions=CONN_x.Results.xX.nconditions;
    cconditions=CONN_x.Results.xX.cconditions;
    if nargin<=1,
        dosinglecontrast=0;
        nsources=1:length(sources);
        csources=ones(1,length(nsources));
    else
        dosinglecontrast=1;
        nsources=varargin{1};
        csources=varargin{2};
    end
    if ~nargout,
        if isfield(CONN_x.Results,'foldername')&&~isempty(CONN_x.Results.foldername),
            [ok,nill]=mkdir(filepathresults2,CONN_x.Results.foldername);
            filepathresults2=fullfile(filepathresults2,CONN_x.Results.foldername);
            CONN_x.Results.foldername=[];
        else,
            foldername={[CONN_x.Analyses(CONN_x.Analysis).name,'.']};
            foldername{end+1}=['SUBJECT_EFFECTS_'];
            for n1=1:length(CONN_x.Results.xX.nsubjecteffects),
                if ~any(diff(CONN_x.Results.xX.csubjecteffects)),foldername{end+1}=[CONN_x.Setup.l2covariates.names{CONN_x.Results.xX.nsubjecteffects(n1)},'.'];
                else, foldername{end+1}=[CONN_x.Setup.l2covariates.names{CONN_x.Results.xX.nsubjecteffects(n1)},'(',num2str(CONN_x.Results.xX.csubjecteffects(n1),'%2.1f'),')','.'];end
            end
            foldername{end+1}=['CONDITIONS_'];
            for n1=1:length(nconditions),
                if ~any(diff(cconditions(:))),foldername{end+1}=[CONN_x.Setup.conditions.names{nconditions(n1)},'.'];
                else, foldername{end+1}=[CONN_x.Setup.conditions.names{nconditions(n1)},'(',num2str(cconditions(:,n1)','%2.1f'),')','.'];end
            end
            foldername=strcat(foldername{:});
            foldername(foldername==' '|foldername==filesep)='_';
            [ok,nill]=mkdir(filepathresults2,foldername);
            if ok,filepathresults2=fullfile(filepathresults2,foldername);
            else,filepathresults2=uigetdir(filepathresults2,'Select a directory to write the results');end
%             if isfield(CONN_x.Results,'foldername')&&~isempty(CONN_x.Results.foldername),
%                 [ok,nill]=mkdir(filepathresults2,CONN_x.Results.foldername);
%                 filepathresults2=fullfile(filepathresults2,CONN_x.Results.foldername);
%             else,
%                 filepathresults2=CONN_x.folders.secondlevel;
%                 filepathresults2=uigetdir(filepathresults2,'Select a directory to write the results');
%             end
        end
        if ~ischar(filepathresults2), return; end;
    end
    X=zeros(CONN_x.Setup.nsubjects,length(CONN_x.Setup.l2covariates.names)-1);
    for nsub=1:CONN_x.Setup.nsubjects,
        for ncovariate=1:length(CONN_x.Setup.l2covariates.names)-1;
            X(nsub,ncovariate)=CONN_x.Setup.l2covariates.values{nsub}{ncovariate};
        end
    end
    nsubjects=find(any(X(:,CONN_x.Results.xX.nsubjecteffects)~=0,2));
    %h=conn_waitbar(0,['Step ',num2str(sum(options<=16)),'/',num2str(length(options)),': ROI data second-level analyses']);
    se.data=0;
    se.dof=0;
    y=0;
    Y=repmat({0},[1,length(nsources)]);
    for n0=1:length(nconditions),
        ncondition=nconditions(n0);
        filename=fullfile(filepathresults1,['resultsROI_Condition',num2str(ncondition,'%03d'),'.mat']);
        if isempty(dir(filename)),
            Ransw=questdlg('First-level ROI analyses have not completed. Perform now?','warning','Yes','No','Yes');
            if strcmp(Ransw,'Yes'), conn_process('analyses_roi'); end
        end
        load(filename,'Z','names','names2','xyz','SE','DOF');
        iroi=[];clear ixyz; for nroi=1:length(sources), 
            roiname=sources{nroi};
            tiroi=strmatch(roiname,names,'exact');
            if isempty(tiroi), error(['Non-existing ROI first-level data for ',roiname,'. Please repeat first-level analyses']); return; end
            iroi(nroi)=tiroi(1);
            ixyz{nroi}=xyz{tiroi(1)};
        end
        for n1=1:length(nsources),
            nroi=nsources(n1);
            yt=permute(Z(iroi(nroi),:,:),[3,2,1]);
            if n0==1&&n1==1, y=zeros([size(yt,1),size(yt,2),length(nsources),length(nconditions)]); end
            if n0==1, Y{n1}=zeros([size(yt,1),size(yt,2),length(nconditions)]); end
            y(:,:,n1,n0)=yt;% subjects x rois x nsources x nconditions
            Y{n1}(:,:,n0)=yt;% subjects x rois x nconditions
            %y=y+bsxfun(@times,yt,shiftdim(csources(:,n1)*cconditions(:,n0)',-2)); % subjects x rois x sourcecontrasts x conditioncontrasts
            %Y{n1}=Y{n1}+bsxfun(@times,yt,shiftdim(cconditions(:,n0),-2)); % subjects x rois x conditioncontrasts
        end        
%         se.data=se.data+(cconditions(n0)*SE).^2;
%         se.dof=se.dof+DOF;
    end
%     se.data=sqrt(se.data);
    %if nargin>1, dosinglecontrast=(varargin{1}==1); else, dosinglecontrast=~(length(nsources)>1 & all(csources==1/length(nsources))); end
    clear SPMall filepathresults3;
    if dosinglecontrast,
        ROIall.xX.X=X(nsubjects,CONN_x.Results.xX.nsubjecteffects);%CONN_x.Results.xX.X;
        ROIall.xX.name={CONN_x.Setup.l2covariates.names{CONN_x.Results.xX.nsubjecteffects}};%CONN_x.Results.xX.name;
%         if ~nargout, filepathresults3{n1}=filepathresults2; end
        ROIall.y=y(nsubjects,:,:,:);
        ROIall.c2=kron(cconditions,csources);
%         ROIall.se=se;
%         ROIall.se.data=sqrt(sum(csources.^2))*ROIall.se.data;
%         ROIall.se.data=ROIall.se.data(nsubjects,:);
%         ROIall.se.dof=ROIall.se.dof(nsubjects);
    else
        for n1=1:length(nsources),
            ROIall(n1).xX.X=X(nsubjects,CONN_x.Results.xX.nsubjecteffects);%CONN_x.Results.xX.X;
            ROIall(n1).xX.name={CONN_x.Setup.l2covariates.names{CONN_x.Results.xX.nsubjecteffects}};%CONN_x.Results.xX.name;
            nroi=nsources(n1);
            roiname=sources{nroi};
%             if ~nargout,[ok,nill]=mkdir(filepathresults2,roiname); filepathresults3{n1}=fullfile(filepathresults2,roiname); end
            ROIall(n1).y=Y{n1}(nsubjects,:,:);
            ROIall(n1).c2=cconditions;
%             ROIall(n1).se=se;
%             ROIall(n1).se.data=ROIall(n1).se.data(nsubjects,:);
%             ROIall(n1).se.dof=ROIall(n1).se.dof(nsubjects);
        end
    end
    clear ROIout;
    for n1=1:length(ROIall),
        ROI=ROIall(n1);
        ROI.names=sources;
        ROI.xyz=ixyz;
        ROI.names2=names2;
        ROI.xyz2=xyz;
        ROI.cname='connectivity result';
        ROI.c=CONN_x.Results.xX.csubjecteffects;%CONN_x.Results.xX.C;

        if ~isfield(CONN_x.Results.xX,'modeltype')||isempty(CONN_x.Results.xX.modeltype), CONN_x.Results.xX.modeltype=1; end
        if CONN_x.Results.xX.modeltype==1, 
            [ROI.h,ROI.F,ROI.p,ROI.dof,ROI.statsname]=conn_glm(ROI.xX.X,permute(ROI.y(:,:,:),[1,3,2]),ROI.c,ROI.c2);
            ROI.h=reshape(ROI.h,[size(ROI.h,1)*size(ROI.h,2),size(ROI.h,3)]);
            if size(ROI.h,1)>1, ROI.h=sqrt(sum(abs(ROI.h).^2,1)); end
            ROI.F=reshape(ROI.F,[size(ROI.F,1)*size(ROI.F,2),size(ROI.F,3)]);
            ROI.p=reshape(ROI.p,[size(ROI.p,1)*size(ROI.p,2),size(ROI.p,3)]);
            %[b,opt]=conn_glmunivariate('estimate',ROI.xX.X,ROI.y);
            %[ROI.h,ROI.F,ROI.p,ROI.dof,nill,ROI.statsname]=conn_glmunivariate('evaluate',opt,[],ROI.c);
        else, 
            [b,opt]=conn_glmunivariate('estimatefixed',ROI.xX.X,ROI.y,ROI.se); 
            [ROI.h,ROI.F,ROI.p,ROI.dof,nill,ROI.statsname]=conn_glmunivariate('evaluatefixed',opt,[],ROI.c);
        end
        ROIout(n1)=ROI;
%         if ~(nargin>1), save(fullfile(filepathresults3{n1},'ROI.mat'),'ROI'); 
%         elseif dosinglecontrast, varargout{1}=ROI; 
%         elseif n1<=length(nsources), varargout{1}(n1)=ROI; end
        %conn_waitbar(1/2+1/2*(n1/(length(nsources)+1)),h);
    end
    varargout{1}=ROIout;
    if ~nargout, ROI=ROIout;save(fullfile(filepathresults2,'ROI.mat'),'ROI'); end
    %conn_waitbar('close',h); ;
    %cd(cwd);
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% Displays second-level SPM.mat results
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if any(options==17) && any(CONN_x.Setup.steps([2])),
    conn_display;
end


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% additional version-update step
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
if 0,%any(options==18),
	[path,name,ext]=fileparts(CONN_x.filename);
% 	filepath=fullfile(path,name,'data');
    filepath=CONN_x.folders.preprocessing;
    filename=fullfile(filepath,['ROI_Subject',num2str(1,'%03d'),'_Condition',num2str(1,'%03d'),'.mat']);
    X1=load(filename);
    [X,nill,names]=conn_designmatrix(CONN_x.Analyses.regressors,X1,[]);
    CONN_x.Analyses(CONN_x.Analysis).sources=names;
%     CONN_x.Results.measure=CONN_x.Analyses.measure;
end

return;

% from SPM5
function savefields(fnam,p)
if length(p)>1, error('Can''t save fields.'); end;
fn = fieldnames(p);
if numel(fn)==0, return; end;
for i=1:length(fn),
    eval([fn{i} '= p.' fn{i} ';']);
end;
if spm_matlab_version_chk('7') >= 0
    save(fnam,'-V6',fn{:});
else
    save(fnam,fn{:});
end;
				
function h=conn_waitbar(varargin);
global CONN_x;
h=[];
if isfield(CONN_x,'gui')&&isnumeric(CONN_x.gui)&&CONN_x.gui, 
    if ischar(varargin{1}), h=varargin{2}; close(h);
    else, h=conn_timedwaitbar(varargin{:}); end
else, 
    if ischar(varargin{1}), conn_cumdisp;
    elseif ~varargin{1}, conn_cumdisp;disp(varargin{2}); 
    else, conn_cumdisp([num2str(100*varargin{1},'%3.1f'),'% ']); end
end

function conn_cumdisp(txt);
% CUMDISP persistent disp
% cumdisp; initializes persistent display
% cumdisp(text); displays persistent text
%
persistent oldtxt;

if nargin<1,
    oldtxt=''; 
    fprintf(1,'\n'); 
else,
    fprintf(1,[repmat('\b',[1,length(oldtxt)]),'%s'],txt);
    oldtxt=sprintf('%s',txt);
end