#! /bin/csh -f # # roiavgraw # # Original Author: Doug Greve # CVS Revision Info: # $Author: nicks $ # $Date: 2007/01/09 22:41:18 $ # $Revision: 1.2 $ # # Copyright (C) 2002-2007, # The General Hospital Corporation (Boston, MA). # All rights reserved. # # Distribution, usage and copying of this software is covered under the # terms found in the License Agreement file named 'COPYING' found in the # FreeSurfer source code root directory, and duplicated here: # https://surfer.nmr.mgh.harvard.edu/fswiki/FreeSurferOpenSourceLicense # # General inquiries: freesurfer@nmr.mgh.harvard.edu # Bug reports: analysis-bugs@nmr.mgh.harvard.edu # set ROIAVGRAW_VER = '$Id: roiavgraw,v 1.2 2007/01/09 22:41:18 nicks Exp $'; set instem = (); set inext = bshort; set roistem = (); set fmaskstem = (); set fframe = 0; set fthresh = 2; set fmasktail = "pos"; set outstem = (); set monly = 0; set synthfunc = 0; set synthroi = 0; set baseline = 1; set percent = 1; set nskip = 0; if($#argv == 0) then echo "USAGE: roiavgraw -roi stem -i stem -o stem [options]"; echo "" echo "Options:" echo " -fmask stem : stem of functional masking volume" echo " -fframe frameno : zero-based frame of mask to use ($fframe)" echo " -fthresh thresh : masking threshold ($fthresh)" echo " -fmasktail sign : masking sign pos, neg, abs ($fmasktail)" echo " -nskip n : skip the first n samples ($nskip)" echo " -nobaseline" echo " -nopercent" echo " -synthfunc" echo "" echo " $ROIAVGRAW_VER" echo " Comments or questions: analysis-bugs@nmr.mgh.harvard.edu" echo "" exit 1; endif goto parse_args; parse_args_return: goto check_params; check_params_return: set fs = `getfirstsliceno $instem`; if($status)then echo "ERROR: cannot find $instem" exit 1; endif set fs = `getfirstsliceno $roistem`; if($status)then echo "ERROR: cannot find $roistem" exit 1; endif if($#fmaskstem != 0) then set fs = `getfirstsliceno $fmaskstem`; if($status)then echo "ERROR: cannot find $fmaskstem" exit 1; endif endif set MATLAB = `getmatlab`; if($status) exit 1; #### Output Directory ####### set OutDir = `dirname $outstem`; set OutBase = `basename $outstem`; mkdir -p $OutDir; if ($monly) then set QuitOnError = 0; set TARGET = "tee $mfile" rm -f $mfile; else set QuitOnError = 1; set TARGET = "$MATLAB -display iconic" endif #---------------------------------------------------------------# $TARGET < 0) fdata = fdata(:,:,:,NSkip+1:Nt); Nt = Nt - NSkip; end if(Ns ~= Nsf | Nr ~= Nrf | Nc ~= Ncf) msg = sprintf('Inconsistent dimensions between roidef and input volumes\n'); msg = sprintf('%s %d,%d %d,%d %d,%d',msg,Ns,Nsf,Nr,Nrf,Nc,Ncf); qoe(msg);error(msg); end if(SynthFunc) fdata = randn(size(fdata)); end fdata = reshape(fdata, [Nv Nt]); %------------------------------------------------% %% Preprocess Functional Data %% if(Percent | Baseline) fdatamean = mean(fdata,2); end if(Baseline) fprintf('Removing Baseline\n'); fdata = fdata - repmat(fdatamean, [1 Nt]); end if(Percent) fprintf('Computing Percent Change\n'); ind = find(fdatamean==0); fdatamean(ind) = 1; fdata = fdata./repmat(fdatamean, [1 Nt]); end %------------------------------------------------% % Find unique ROI identifiers % roiid = unique(roidef); nroi = length(roiid); fprintf('Found %3d ROIs\n',nroi); %--------------------------------------------------------% roidef_fmask = roidef; if(~isempty(FMaskStem)) fmask = fmri_ldbvolume(FMaskStem); fmask = fmask(:,:,:,FFrame+1); if(strcmp(FTail,'neg')) fmask = -fmask; elseif(strcmp(FTail,'abs')) fmask = abs(fmask); end imask0 = find(fmask < FThresh); roidef_fmask(imask0) = 0; end %------------------------------------------------% % Open the log file and write some information % fname = sprintf('%s.log',OutStem); fid = fopen(fname,'w'); if(fid == -1) msg = sprintf('Could not open %s',fname); qoe(msg); error(msg); end fprintf(fid,'ROI Avg Raw Log File %s\n',date); fprintf(fid,'InStem: %s\n',InStem); fprintf(fid,'ROIStem: %s\n',ROIStem); fprintf(fid,'FMaskStem: %s\n',FMaskStem); fprintf(fid,'FFrame: %d\n',FFrame); fprintf(fid,'FThresh: %g\n',FThresh); fprintf(fid,'FTail: %s\n',FTail); fprintf(fid,'OutStem: %s\n',OutStem); fprintf(fid,'Baseline: %d\n',Baseline); fprintf(fid,'Percent: %d\n',Percent); fprintf(fid,'nROIs: %d\n',nroi); fprintf(fid,'Nt %3d\n',Nt); %------------------------------------------------% % Perform within ROI averaging % roiavg = zeros(nroi,Nt); for roi = 1:nroi ind = find(roidef==roiid(roi)); indf = find(roidef_fmask==roiid(roi)); fprintf('%3d %3d %5d %5d\n',roi,roiid(roi),length(indf),length(ind)); fprintf(fid,'%3d %3d %5d %5d\n',roi,roiid(roi),length(indf),length(ind)); if(~isempty(indf)) if(length(indf) > 1) roiavg(roi,:) = mean(fdata(indf,:)); else roiavg(roi,:) = fdata(indf,:); end else roiavg(roi,:) = 0; end end fclose(fid); %------------------------------------------------% % Save results to an ascii file % fmt = repmat('%9.5f ',[1 nroi]); fmt = [fmt '\n']; results = [roiavg]; fname = sprintf('%s.dat',OutStem); fid = fopen(fname,'w'); if(fid == -1) msg = sprintf('Could not open %s',fname); qoe(msg); error(msg); end fprintf(fid,fmt,results); fclose(fid); %------------------------------------------------% % Also save results to a bfloat file % fname = sprintf('%s_000.bfloat',OutStem); fmri_svbfile(reshape(roiavg,[1 nroi Nt]),fname); if(QuitOnError) quit; end EOF exit 0; ############--------------################## parse_args: set cmdline = "$argv"; while( $#argv != 0 ) set flag = $argv[1]; shift; switch($flag) case "-i": if ( $#argv == 0) goto arg1err; set instem = ($instem $argv[1]); shift; breaksw case "-o": if ( $#argv == 0) goto arg1err; set outstem = $argv[1]; shift; breaksw case "-roi": if ( $#argv == 0) goto arg1err; set roistem = $argv[1]; shift; breaksw case "-fmask": if ( $#argv == 0) goto arg1err; set fmaskstem = $argv[1]; shift; breaksw case "-fthresh": if ( $#argv == 0) goto arg1err; set fthresh = $argv[1]; shift; breaksw case "-fframe": if ( $#argv == 0) goto arg1err; set fframe = $argv[1]; shift; breaksw case "-nskip": if ( $#argv == 0) goto arg1err; set nskip = $argv[1]; shift; breaksw case "-firstslice": case "-fs": if ( $#argv == 0) goto arg1err; set firstslice = $argv[1]; shift; breaksw case "-nslices": case "-ns": if ( $#argv == 0) goto arg1err; set Nslices = $argv[1]; shift; breaksw case "-nullroi": # not used if ( $#argv == 0) goto arg1err; set nullroi = $argv[1]; shift; breaksw case "-TR": # not used if ( $#argv == 0) goto arg1err; set TR = $argv[1]; shift; breaksw case "-bfloat": set inext = bfloat; breaksw case "-bshort": set inext = bshort; breaksw case "-percent": set percent = 1; breaksw case "-nopercent": set percent = 0; breaksw case "-baseline": set baseline = 1; breaksw case "-synth": set synthfunc = 1; breaksw case "-synthfunc": set synthfunc = 1; breaksw case "-nobaseline": set baseline = 0; breaksw case "-monly": if ( $#argv == 0) goto arg1err; set mfile = $argv[1]; shift; set monly = 1; breaksw case "-debug": case "-verbose": set verbose = 1; breaksw default: echo ERROR: Flag $flag unrecognized. echo $cmdline exit 1 breaksw endsw end goto parse_args_return; ############--------------################## ############--------------################## check_params: if ($#instem == 0) then echo "ERROR: must specify an input stem"; exit 1 endif if ($#outstem == 0) then echo "ERROR: must specify an output stem"; exit 1 endif if ($#roistem == 0) then echo "ERROR: must specify a roi stem"; exit 1 endif goto check_params_return; ############--------------################## ############--------------################## arg1err: echo "ERROR: flag $flag requires one argument" exit 1 ############--------------##################