%script MatAFNI_Demo
%
%
%
%Purpose:
%   Demonstrate the use of the matlab AFNI library
%   The script is echoed onto the screen but it is best
%   you read through it with a text editor.
%
%
%Input:
%   You must have the data sets
%   ARzs_CW_avvr+orig, ARzs_CW_avvr.DEL+orig and ARzsspgrax+orig
%   in the working directory
%
%Output:
%
%
%
%
%
%Key Terms:
%
%More Info :
%
%
%
%
%     Author : Ziad Saad
%     Date : Tue Aug 28 16:21:54 PDT 2001
%     SSCC/NIMH/ National Institutes of Health, Bethesda Maryland

echo on

clear all

%check for data sets before proceeding
	if (exist('ARzs_CW_avvr+orig.HEAD') ~= 2 | exist('ARzs_CW_avvr+orig.BRIK') ~= 2),
		fprintf ('\nERROR: Missing ARzs_CW_avvr+orig data.\nCtrl+c to Abort.\n');
		while (1),
			pause;
		end
	end

	if (exist('ARzs_CW_avvr.DEL+orig.HEAD') ~= 2 | exist('ARzs_CW_avvr.DEL+orig.BRIK') ~= 2),
		fprintf ('\nERROR: Missing ARzs_CW_avvr.DEL+orig data.\nCtrl+c to Abort.\n');
		while (1),
			pause;
		end
	end
	if (exist('ARzsspgrax+orig.HEAD') ~= 2 | exist('ARzsspgrax+orig.BRIK') ~= 2),
		fprintf ('\nERROR: Missing ARzsspgrax+orig data.\nCtrl+c to Abort.\n');
		while (1),
			pause;
		end
	end

%%%%%%%%%%%%%% Read time series and access time series %%%%%%%%%%%%%%%%%%%%%%%%
	fprintf (1,'\tpatience...\n');
	%read in a brick and display voxel with AFNI i j k: 29, 33, 3
		BrikName = 'ARzs_CW_avvr+orig';
		Vox_Ind = [29 33 3];

	%Do it using matrix format for V.
		Opt.Format = 'matrix';
		[err, Vm, Info, ErrMessage] = BrikLoad (BrikName, Opt);
	%plot it
 		figure(1); clf; subplot (211);
		plot (squeeze(Vm(Vox_Ind(1)+1,Vox_Ind(2)+1, Vox_Ind(3)+1, :)));


	%Do it using vector format for V. Note that this example does not highlight
	%the advantage of using the vector format.
		Opt.Format = 'vector';
		[err, Vv, Info, ErrMessage] = BrikLoad (BrikName, Opt);
	%figure out the AFNI 1D index of the voxel
		[err, Indx] = AfniXYZ2AfniIndex (Vox_Ind, Info.DATASET_DIMENSIONS(1), Info.DATASET_DIMENSIONS(2));
   %
   %See also functions: AFNI_Index2XYZcontinuous, and AFNI_XYZcontinuous2Index
   %
	%plot it. Remember that indexing in matlab is always augmented by 1 relative to AFNI's
 		figure(1); subplot (212);
		plot (Vv(Indx+1,:));
		plotsign2(1);

	drawnow
	msgbox(sprintf('Showing Time Series From %s.\nFrom AFNI''s viewer, use jump to:  %g %g %g to see the same time series',...
	  BrikName, Vox_Ind(1),Vox_Ind(2), Vox_Ind(3)));
	fprintf (1,'\nHit Enter to Proceed with Demo  (ctrl+c to abort)...\n'); pause
	
%%%%%%%%%%%%%% Read Anatomy and grab a slice %%%%%%%%%%%%%%%%%%%%%%%%
	fprintf (1,'\tpatience...\n');
	%read in anatomy brick
		BrikNameAnat = 'ARzsspgrax+orig';
		[err, Vanat, InfoAnat, ErrMessage] = BrikLoad (BrikNameAnat);	
	
	%Grab a few slices in the same plane
		OptDisp.plane = 'Ax';
		OptDisp.iSlc = [107 79 45]; %Those are AFNI indices, see help GetAfniSlice for more info
		[err, slc, slcDisp] = GetAfniSlice (Vanat, InfoAnat, OptDisp);
		figure(2); clf
		subplot 321; imagesc (slc.M(:,:,1)); title (sprintf('Ax #%g, As In Brick', OptDisp.iSlc(1)));
		subplot 322; imagesc (slcDisp.M(:,:,1)); title (sprintf('Ax #%g, As Displayed', OptDisp.iSlc(1)));
		subplot 323; imagesc (slc.M(:,:,2));title (sprintf('Ax #%g, As In Brick', OptDisp.iSlc(2)));
		subplot 324; imagesc (slcDisp.M(:,:,2));	title (sprintf('Ax #%g, As Displayed', OptDisp.iSlc(2)));
		subplot 325; imagesc (slc.M(:,:,3));title (sprintf('Ax #%g, As In Brick', OptDisp.iSlc(3)));
		subplot 326; imagesc (slcDisp.M(:,:,3));	title (sprintf('Ax #%g, As Displayed', OptDisp.iSlc(3)));
		colormap gray %you need to use some scaling to get the display to work best
		plotsign2(2);
		
		drawnow
		msgbox(sprintf('Showing Anatomy Brick %s.\nFrom AFNI''s axial viewer, use slider to view slices %g, %g and %g that are displayed in the right column of the figure.',...
		 BrikNameAnat, OptDisp.iSlc(1),OptDisp.iSlc(2), OptDisp.iSlc(3)));
		fprintf (1,'\nHit Enter to Proceed with Demo  (ctrl+c to abort)...\n'); pause
		
%%%%%%%%%%%%%% Read Functional brick and grab a slice triplet %%%%%%%%%%%%%%%%%%%%%%%%
	fprintf (1,'\tpatience...\n');
	%grab a triplet of slices from .DEL functional Brick
		BrikNameFunc = 'ARzs_CW_avvr.DEL+orig';
		[err, Vfunc, Infofunc, ErrMessage] = BrikLoad (BrikNameFunc);	
		
		DM = AFNI_SliceDispManip (Infofunc);
		OptDispFunc.iSlc = [31 32 6];
		OptDispFunc.index = 2;
		[err, slc] = GetAfniSliceTriplet (Vfunc, Infofunc, DM, OptDispFunc);

		%mask voxels less than 0.5 . NOT EFFICIENT AT ALL, better do this for the entire sub-brick
                %for demo purposes only                             
                imsk = find (slc(1).M < 0.5); slc(1).M(imsk) = 0;
                imsk = find (slc(2).M < 0.5); slc(2).M(imsk) = 0;
                imsk = find (slc(3).M < 0.5); slc(3).M(imsk) = 0;
                imsk = find (slc(1).Mdisp < 0.5); slc(1).Mdisp(imsk) = 0;
                imsk = find (slc(2).Mdisp < 0.5); slc(2).Mdisp(imsk) = 0;
                imsk = find (slc(3).Mdisp < 0.5); slc(3).Mdisp(imsk) = 0;
                figure(3); clf

		subplot 321; imagesc (slc(1).M(:,:)); title (sprintf('Ax #%g, As In Brick', OptDispFunc.iSlc(1))); 
		subplot 322; imagesc (slc(1).Mdisp(:,:)); title (sprintf('Ax #%g, As Displayed', OptDispFunc.iSlc(1)));
		subplot 323; imagesc (slc(2).M(:,:));title (sprintf('Sa #%g, As In Brick', OptDispFunc.iSlc(2)));
		subplot 324; imagesc (slc(2).Mdisp(:,:));	title (sprintf('Sa #%g, As Displayed', OptDispFunc.iSlc(2)));
		subplot 325; imagesc (slc(3).M(:,:));title (sprintf('Co #%g, As In Brick', OptDispFunc.iSlc(3)));
		subplot 326; imagesc (slc(3).Mdisp(:,:));	title (sprintf('Co #%g, As Displayed', OptDispFunc.iSlc(3)));
		colormap gray %you need to use some scaling to get the display to work best
		plotsign2(3);
		
		drawnow
		msgbox(sprintf('Showing Slice Triplet from Functional Brick %s.\nFrom AFNI''s axial viewer, use slider to view slices %g, %g and %g that are displayed in the right column of the figure.\nSet Func underlay and set Func sub-brick to #%g\nSet Thr sub-brick to #%g and set threshold slider to 0.5\nIgnore color mismatch as color maps are different',...
		 BrikNameFunc, OptDispFunc.iSlc(1),OptDispFunc.iSlc(2), OptDispFunc.iSlc(3), OptDispFunc.index, OptDispFunc.index)); 
		fprintf (1,'\nHit Enter to Proceed with Demo (ctrl+c to abort)...\n'); pause


%%%%%%%%%%%%%%%%% Show a cool graph %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
		fprintf (1,'\tpatience...\n');
		%Extract the delay and cross correlation coefficient sub-bricks
		%see Infofunc.BRICK_LABS for indexing info
		Vdel = squeeze(Vfunc(:,:,:,1)); %that's not necessary but it makes annotation and referencing clear
		Vxcor = squeeze(Vfunc(:,:,:,3));		
		
		%find the cross correlation coefficients < 0.5
		inoact = find(Vxcor < 0.5);
		
		%mask those voxels with  -1
		Vdel(inoact) = -1;
		
		%make sure no voxels having a delay outside [0 .. 40] are masked
		iout = find(Vdel < 0 | Vdel > 40);
		Vdel(iout) = -1; %Note that for efficiency, the previous two steps can be combined into 1
		
		%also mask the Cross Correlation Subbrick for later use
		Vxcor(iout) = 0;
		
		%Extract axial slice 29
		OptFunc2.iSlc = 29;
		OptFunc2.plane = 'Ax';
		[err, slc, slcDisp] = GetAfniSlice (Vdel, Infofunc, OptFunc2);
		
		%interpolate for pretty pictures
		SlcShow = interp2(slcDisp.M, 3, 'cubic');
		
		%display a surface mesh of delay values for slice
		figure(4); clf
		subplot (211);
		hs = surf(SlcShow, 'EdgeColor', 'none'); title ('Surface Plot of Delay Values');
		subplot (223);
		hc = contour (SlcShow); title ('Contour Plot');
		subplot (224);
		ipos = find(Vdel >= 0);
		hist(Vdel(ipos),20); title ('Histogram');
		plotsign2(4);
		drawnow;
		fprintf (1,'\nHit Enter to Proceed with Demo (ctrl+c to abort)...\n'); pause

%%%%%%%%%%%%%%%%% Writing Out Functional Data %%%%%%%%%%%%%%%%%%%%%%%%%%%
	%Write out delay brick with only the masked voxels showing
	
	fprintf (1,'\tpatience...\n');
	%We need to setup the header info for the new data set to write out
	%Copy the header info from the .DEL brick
	InfoDelOut = Infofunc;
	%modify the necessary fields
	%YOU MUST READ THE HELP for the function WriteBrik and BrikInfo
	InfoDelOut.RootName = ''; %that'll get set by WriteBrik
	InfoDelOut.DATASET_RANK(2) = 2; %two sub-bricks
	InfoDelOut.BRICK_TYPES = [1 1]; %store data as shorts
	InfoDelOut.BRICK_STATS = []; %automatically set
	InfoDelOut.BRICK_FLOAT_FACS = [];%automatically set
	InfoDelOut.BRICK_LABS = 'Masked Delay~Masked Cross Correlation';
	InfoDelOut.IDCODE_STRING = '';%automatically set
	InfoDelOut.BRICK_STATAUX = [1 2 3 160 2 2];
	
	OptDelOut.Scale = 1;
	OptDelOut.Prefix = 'Demo1_func';
	OptDelOut.verbose = 0;

	!rm Demo1_func*

	%To write the two sub-bricks, I placed them in an Nx2 matrix [Vdel(:) Vxcor(:)]
%     sizes = size([Vdel(:) Vxcor(:)]);
%     M = zeros(1, sizes(1), sizes(2));
%     M(1,:,:) = [Vdel(:) Vxcor(:)];

        InfoDelOut.DATASET_DIMENSIONS = [64 64 18]; %size([Vdel(:) Vxcor(:)]);
        OptDelOut.AdjustHeader = 'x';
	[err, ErrMessage, InfoDelOut] = WriteBrik([Vdel(:) Vxcor(:)], InfoDelOut, OptDelOut);

	if (err),
		errordlg(sprintf('%s\nAbort now (ctrl+c).', ErrMessage));
		while (1),
			pause;
		end
	end
	
	msgbox(sprintf('Data set %s+orig was written to disk, check it out with AFNI.',...
		 OptDelOut.Prefix));

	fprintf (1,'\nHit Enter to Proceed with Demo (ctrl+c to abort)...\n'); pause

%%%%%%%%%%%%%%%%% Writing Out time series %%%%%%%%%%%%%%%%%%%%%%%%%%%
	fprintf (1,'\tpatience...\n');
	%Write out random time series where functional voxels passed the threshold above
	%find voxel indices that are not masked
	[i_in] = setdiff([1:1:prod(Info.DATASET_DIMENSIONS(1:3))],iout);
	%create that many random time series
	Mrand = randn(length(i_in), Info.DATASET_RANK(2));
	%create an empty volume
	Vnew = zeros(prod(Info.DATASET_DIMENSIONS(1:3)), Info.DATASET_RANK(2));
	%replace zeros with random time series
	Vnew(i_in,:) = Mrand;
	
	%prepare Header for writing
	InfoNewTSOut = Info;
	InfoNewTSOut.RootName = '';
	InfoNewTSOut.BRICK_STATS = []; %automatically set
	InfoNewTSOut.BRICK_FLOAT_FACS = []; %automatically set
	InfoNewTSOut.IDCODE_STRING = '';%automatically set
        InfoDelOut.DATASET_DIMENSIONS = [64 64 18]; %size([Vdel(:) Vxcor(:)]);
        OptTSOut.AdjustHeader = 'x';


	OptTSOut.Scale = 1;
	OptTSOut.Prefix = 'Demo1_TS';
	OptTSOut.verbose = 1;
	!rm Demo1_TS*
	%write it
	[err, ErrMessage, InfoNewTSOut] = WriteBrik (Vnew, InfoNewTSOut, OptTSOut);
	msgbox(sprintf('Data set %s+orig was written to disk, check it out with AFNI.',...
		 OptTSOut.Prefix));
	
	if (err),
		errordlg(sprintf('%s\nAbort now (ctrl+c).', ErrMessage));
		while (1),
			pause;
		end
	end
	
	fprintf (1,'\nDemo Done\n');

echo off				
