/*****************************************************************************
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 "mrilib.h"
/*-----------------------------------------------------------------------------
Routine to edit cluster array.
clar = cluster array to be edited
edit_clust = flag to indicate cluster editing option
dxyz = volume of a voxel
vmul = minimum volume for a cluster
The edited cluster array is returned in clar.
Author : B. D. Ward
Date : 10 September 1996
Modified 09 June 1998 by RWCox to add ECFLAG_ORDER option.
-----------------------------------------------------------------------------*/
void EDIT_cluster_array (MCW_cluster_array * clar, int edit_clust,
float dxyz, float vmul)
{
int iclu; /* cluster index */
int nclu; /* non-empty cluster index */
int ii; /* voxel index */
float
mag, /* voxel intensity */
sum, /* sum of voxel intensities */
max, /* maximum of voxel intensities */
amax, /* maximum of absolute voxel intensities */
smax, /* signed maximum of absolute voxel intensities */
mean, /* mean of voxel intensities */
size; /* size of cluster (multiples of vmul) */
ENTRY("EDIT_cluster_array") ;
if( edit_clust == ECFLAG_ORDER ){
SORT_CLARR(clar) ;
}
nclu = 0;
for (iclu = 0; iclu < clar->num_clu; iclu++)
{
if ((clar->clar[iclu] != NULL) && (clar->clar[iclu]->num_pt > 0))
{
nclu++;
/* initialization of basic statistics for this cluster */
sum = max = smax = clar->clar[iclu]->mag[0];
amax = fabs(smax);
/* calculate basic statistics for this cluster */
for (ii = 1; ii < clar->clar[iclu]->num_pt; ii++)
{
mag = clar->clar[iclu]->mag[ii];
switch (edit_clust)
{
case ECFLAG_MEAN :
sum += mag; break;
case ECFLAG_MAX :
if (mag > max) max = mag; break;
case ECFLAG_AMAX :
if (fabs(mag) > amax) amax = fabs(mag); break;
case ECFLAG_SMAX :
if (fabs(mag) > fabs(smax)) smax = mag; break;
case ECFLAG_SIZE : break;
default : break;
}
}
/* additional calculations */
if (edit_clust == ECFLAG_MEAN)
mean = sum / clar->clar[iclu]->num_pt;
if (edit_clust == ECFLAG_SIZE)
size = clar->clar[iclu]->num_pt * dxyz / vmul;
/* set all voxel intensities in this cluster to the same value */
for (ii = 0; ii < clar->clar[iclu]->num_pt; ii++)
{
switch (edit_clust)
{
case ECFLAG_MEAN : clar->clar[iclu]->mag[ii] = mean; break;
case ECFLAG_MAX : clar->clar[iclu]->mag[ii] = max; break;
case ECFLAG_AMAX : clar->clar[iclu]->mag[ii] = amax; break;
case ECFLAG_SMAX : clar->clar[iclu]->mag[ii] = smax; break;
case ECFLAG_SIZE : clar->clar[iclu]->mag[ii] = size; break;
case ECFLAG_ORDER: clar->clar[iclu]->mag[ii] = nclu; break;
default : break;
}
}
}
} /* iclu */
EXRETURN ;
}
syntax highlighted by Code2HTML, v. 0.9.1