/*****************************************************************************
Major portions of this software are copyrighted by the Medical College
of Wisconsin, 1994-2000, and are released under the Gnu General Public
License, Version 2. See the file README.Copyright for details.
******************************************************************************/
#include "afni.h"
#ifndef ALLOW_PLUGINS
# error "Plugins not properly set up -- see machdep.h"
#endif
/***********************************************************************
************************************************************************/
char * Fourier_Main( PLUGIN_interface * ) ;
static char helpstring[] =
" Purpose: Do some common FFT manipulations of 3d+time data\n"
" Inputs:\n"
" Dataset = A 3d+time dataset in memory.\n"
" Outputs:\n"
" Prefix = Filename prefix to be usedfor the output dataset.\n"
" Parameters:\n"
" Preprocess: Data manipulations before/after filtering\n"
" Ignore: ignore the first n datapoints. After filtering\n"
" these points are set to the value of the n+1th point\n"
" such that the timeseries is the same length\n"
" A linear trend is removed before any filtering is performed.\n"
" Setting retrend to 'Yes' restores this trend after filtering\n"
" This is always yes for the 1D transform version\n"
" Lowpass: Perform a low pass filtering of the data.\n"
" Fc is the frequency cutoff (in Hz). Note that this is\n"
" typically a very small number.\n"
" Highpass: Perform a high pass filtering of the data.\n"
" Fc is the frequency cutoff (in Hz). Note that this is\n"
" typically a very small number.\n\n"
" With appropriate combination of lowpass and highpass, a\n"
" bandpass (f_high < f_low) or notch (f_high > f_low)\n"
" filter can be made.\n"
/* " Autocorrelate: Perform an autocorrelation (DUH) of the time-\n"
" series. Essentially the correlation between the data and\n"
" and all possible phase shifts of it.\n\n"
*/ " Note that if multiple operations are chosen, they are performed\n"
" in the order listed.\n\n"
" IMPORTANT: This plugin also sets the parameters for the 1D \n"
" transform named Fourier. Thus, it is not necessary to have\n"
" an input and output.\n\n"
" BY- T. Ross and K. Heimerl 8/99\n"
;
static float low_fc, high_fc; /* Global variables so we can be a plugin or 1D transformation filter */
static char *output_prefix;
static int autocorr, retrend, ignore;
static MCW_idcode *idc;
/***********************************************************************
include the filter driver and filter routines
************************************************************************/
#define IN_FOURIER_PLUGIN
#include "fourier_filter.c"
/***********************************************************************
1D transformation function
************************************************************************/
void fourier_1D(int num, double to, double dt, float *vec) {
filter(vec, low_fc, high_fc, num, (float)dt, ignore, TRUE, TRUE);
}
/***********************************************************************
Set up the interface to the user
************************************************************************/
DEFINE_PLUGIN_PROTOTYPE
PLUGIN_interface * PLUGIN_init( int ncall )
{
PLUGIN_interface * plint ;
static char *yn[2] = {"No", "Yes"};
if( ncall > 0 ) return NULL ; /* only one interface */
/*-- set titles and call point --*/
/* Initialize variables so we can be a 1D transformer*/
low_fc=0; high_fc = 0; ignore=1; autocorr=FALSE; retrend=FALSE; output_prefix=NULL; idc=NULL;
PLUTO_register_1D_function( "Fourier", fourier_1D );
plint = PLUTO_new_interface( "Fourier Stuff" , "Filtering, autocorrelation and other stuff done with FFTs" , helpstring ,
PLUGIN_CALL_VIA_MENU , Fourier_Main ) ;
PLUTO_add_hint( plint , "Filtering, autocorrelation and other stuff done with FFTs" ) ;
PLUTO_set_sequence( plint , "z:Ross" ) ;
/*-- first line of input: Dataset --*/
PLUTO_add_option( plint , "Input" , "Input" , FALSE ) ;
PLUTO_add_dataset(plint , "Dataset" ,
ANAT_ALL_MASK , FUNC_ALL_MASK ,
DIMEN_4D_MASK | BRICK_ALLREAL_MASK ) ;
/*-- second line of input: Prefix for output dataset --*/
PLUTO_add_option( plint , "Output" , "Output" , FALSE ) ;
PLUTO_add_string( plint , "Prefix" , 0, NULL , 19 ) ;
/*-- third line of input: Preprocessing --*/
PLUTO_add_option( plint , "Preprocess" , "Preprocess" , TRUE ) ;
PLUTO_add_number( plint , "Ignore" , 0, 10, 0, 1 , FALSE) ;
PLUTO_add_string( plint, "Re-trend", 2, yn, 0);
/*-- fourth line of input: Lowpass option --*/
PLUTO_add_option( plint , "Lowpass" , "Lowpass" , FALSE ) ;
PLUTO_add_number( plint , "Fc" , 0, 5000, 3, 0 , TRUE) ;
/*-- fifth line of input: Highass option --*/
PLUTO_add_option( plint , "Highpass" , "Highpass" , FALSE ) ;
PLUTO_add_number( plint , "Fc" , 0, 5000, 3, 0 , TRUE) ;
/*-- sixt line of input: Autocorrelation option --*/
/*
PLUTO_add_option( plint , "Autocorrelate" , "Autocorrelate" , FALSE ) ;
*/
return plint ;
}
/***************************************************************************
Main routine for this plugin (will be called from AFNI).
****************************************************************************/
char * Fourier_Main( PLUGIN_interface * plint )
{
THD_3dim_dataset *input ;
char *tag;
/* New call, so reinitialize variables */
low_fc=0; high_fc = 0; autocorr=FALSE; retrend=FALSE; output_prefix=NULL, idc=NULL;
/*--------------------------------------------------------------------*/
/*----- Check inputs from AFNI to see if they are reasonable-ish -----*/
if( plint == NULL )
return "*************************\n"
"Fourier_Main: NULL input\n"
"*************************" ;
tag = PLUTO_get_optiontag(plint) ;
while( tag != NULL ){
if (strcmp(tag, "Input") == 0 ) {
idc = PLUTO_get_idcode(plint) ;
input = PLUTO_find_dset(idc) ;
if( input == NULL )
return "********************************\n"
"Fourier_Main: bad input dataset\n"
"********************************" ;
}
else if (strcmp(tag, "Preprocess") == 0) {
ignore = PLUTO_get_number(plint);
retrend = strcmp(PLUTO_get_string(plint), "No");
}
else if( strcmp(tag,"Output") == 0 ){
output_prefix = PLUTO_get_string(plint) ;
if( ! PLUTO_prefix_ok(output_prefix) )
return "*************************\n"
"Fourier_Main: bad prefix\n"
"*************************" ;
}
else if( strcmp(tag,"Lowpass") == 0 ){
low_fc = PLUTO_get_number(plint);
}
else if( strcmp(tag,"Highpass") == 0 ){
high_fc = PLUTO_get_number(plint);
}
else if( strcmp(tag,"Autocorrelate") == 0 ){
autocorr=TRUE;
}
tag = PLUTO_get_optiontag(plint) ;
}
/*------------------------------------------------------*/
/*---------- At this point, the inputs are OK ----------*/
if ((output_prefix == NULL) || (idc == NULL)) /* must be setting up for 1D transform */
return NULL ;
else
return Fourier_Filter_Driver(plint, input, low_fc, high_fc, ignore, autocorr, retrend, output_prefix);
}
syntax highlighted by Code2HTML, v. 0.9.1