18 template< 
typename TYPE1, 
typename TYPE2 >
    19 void KWUtil::copyArrayToArray(
int nSamples, TYPE1 *arrayTo, 
const TYPE2 *arrayFrom){
    21     if (arrayFrom == NULL){
    26     for (
int i = 0; i < nSamples; i++)
    27         arrayTo[i] = (TYPE1)arrayFrom[i];
    34 template<
typename TYPE>
    36     std::cout << name << 
" ";
    37     for (
unsigned int i = 0; i < vector.size(); ++i){
    38         std::cout << 
"  " << vector.at(i);
    40     std::cout << std::endl;
    43 template<
typename TYPE>
    45     std::cout << name << std::endl;
    46     for (
unsigned int i = 0; i < vector.size(); ++i){
    47         std::cout << 
"  " << vector.at(i) << std::endl;
    55 template< 
typename TYPE >
    56 void KWUtil::printArray(
int nSamples, 
const TYPE *myarray){
    57     for (
int i=0; i<nSamples; i++){
    58         std::cout << myarray[i] << 
" ";
    62 template< 
typename TYPE >
    63 void KWUtil::printArray(
int nSamples, 
const TYPE *myarray, 
int width){
    64     for (
int i=0; i<nSamples; i++){
    65         std::cout << std::setw(width) << myarray[i] << 
" ";
    69 template< 
typename TYPE >
    70 void KWUtil::printArray(
int nSamples, 
const TYPE *myarray, 
char* text){
    72     printArray(nSamples, myarray);
    75 template< 
typename TYPE >
    76 void KWUtil::printArray(
bool doPrint, 
int nSamples, 
const TYPE *myarray){
    77     if(doPrint) printArray(nSamples, myarray);
    80 template< 
typename TYPE >
    81 void KWUtil::printArray(
bool doPrint, 
int nSamples, 
const TYPE *myarray, 
char* text){
    82     if(doPrint) printArray(nSamples, myarray, text);
    89 template< 
typename TYPE >
    90 void KWUtil::printArray2D(
int nRows, 
int nCols, TYPE **myarray){
    91     for(
int i = 0; i < nRows; i++){
    92         for(
int j = 0; j < nCols; j++)
    93             std::cout << myarray[i][j] << 
"\t";
    94         std::cout << std::endl;
    96     std::cout << std::endl;
    99 template< 
typename TYPE >
   100 void KWUtil::printArray2D(
int nRows, 
int nCols, TYPE **myarray, 
char * text){
   102     printArray2D(nRows, nCols, myarray);
   105 template< 
typename TYPE >
   106 void KWUtil::printArray2D(
bool doPrint, 
int nRows, 
int nCols, TYPE **myarray){
   107     if(doPrint) printArray2D(nRows, nCols, myarray);
   110 template< 
typename TYPE >
   111 void KWUtil::printArray2D(
bool doPrint, 
int nRows, 
int nCols, TYPE **myarray, 
char * text){
   112     if(doPrint) printArray2D(nRows, nCols, myarray, text);
   116 template< 
typename TYPE >
   117 void KWUtil::printStdVector(
const std::vector<TYPE> myvector){
   118     int nSamples = myvector.size();
   119     KWUtil::printArray(nSamples, &myvector[0]);
   122 template< 
typename TYPE >
   123 void KWUtil::printStdVector(
const std::vector<TYPE> myvector, 
char* text){
   124     int nSamples = myvector.size();
   125     KWUtil::printArray(nSamples, &myvector[0], text);
   128 template< 
typename TYPE >
   129 void KWUtil::printStdVector(
bool doPrint, 
const std::vector<TYPE> myvector){
   130     int nSamples = myvector.size();
   131     KWUtil::printArray(doPrint, nSamples, &myvector[0]);
   134 template< 
typename TYPE >
   135 void KWUtil::printStdVector(
bool doPrint, 
const std::vector<TYPE> myvector, 
char* text){
   136     int nSamples = myvector.size();
   137     KWUtil::printArray(doPrint, nSamples, &myvector[0], text);
   144 template< 
typename TYPE >
   145 void KWUtil::swap(TYPE &a, TYPE &b){
   151 template< 
typename TYPE >
   152 TYPE KWUtil::max(TYPE a, TYPE b){
   153     return (a > b) ? a : b;
   156 template< 
typename TYPE >
   157 TYPE KWUtil::min(TYPE a, TYPE b){
   158     return (a < b) ? a : b;
   161 template< 
typename TYPE >
   162 TYPE KWUtil::calcSumArray(
int nSamples, 
const TYPE *myarray){
   164     for(
long i = 0; i < nSamples; i++){
   170 template< 
typename TYPE >
   171 double KWUtil::calcMeanArray(
int nSamples, 
const TYPE *myarray){
   174     else if (nSamples == 1)
   177         return (calcSumArray(nSamples,myarray)/nSamples);
   180 template< 
typename TYPE >
   181 double KWUtil::calcMedianArray(
int nSamples, 
const TYPE *myarray){
   184     } 
else if (nSamples == 1){
   187         TYPE *sortedArray = 
new TYPE[nSamples];
   188         KWUtil::copyArrayToArray(nSamples, sortedArray, myarray);
   189         KWUtil::quickSort(nSamples, sortedArray);
   193             result = sortedArray[(nSamples - 1) / 2];
   196             int pos = nSamples/2-1;
   197             result = (sortedArray[pos] + sortedArray[pos+1]) / 2;
   199         delete[] sortedArray;
   204 template< 
typename TYPE >
   205 double KWUtil::calcStandardDeviationArray(
int nSamples, 
const TYPE *myarray) {
   209         TYPE mymean = KWUtil::calcMeanArray(nSamples, myarray);
   211         for (
unsigned int i = 0; i < nSamples; ++i){
   212             sum = sum + (myarray[i] - mymean) * (myarray[i] - mymean);
   214         return sqrt(sum/(nSamples-1));
   218 template< 
typename TYPE >
   220 double KWUtil::calcR2ss(
int nSamples, 
const TYPE *fitted, 
const TYPE *ysignal){
   222     TYPE meanYsignal = TYPE(); 
   226     for (
int i = 0; i < nSamples; i++){
   227         meanYsignal = meanYsignal + ysignal[i];
   229     meanYsignal = meanYsignal/nSamples;
   230     for (
int i = 0; i < nSamples; i++){
   231         SStot = SStot + (ysignal[i] - meanYsignal)*(ysignal[i] - meanYsignal);
   233     for (
int i = 0; i < nSamples; i++){
   234         SSres = SSres + (ysignal[i] - fitted[i])*(ysignal[i] - fitted[i]);
   239         return 1-SSres/SStot;
   243 template< 
typename TYPE >
   244 double KWUtil::calcR2cor(
int nSamples, 
const TYPE *fitted, 
const TYPE *ysignal){
   252     TYPE meanY = 0, meanF = 0, sumYY = 0, sumFF = 0, covYF = 0; 
   253     for (
int i = 0; i < nSamples; i++){
   254         meanY = meanY + ysignal[i];
   255         meanF = meanF + fitted[i];
   257     meanY = meanY/nSamples;
   258     meanF = meanF/nSamples;
   259     for (
int i = 0; i < nSamples; i++){
   260         sumYY = sumYY + (ysignal[i] - meanY)*(ysignal[i] - meanY);
   261         sumFF = sumFF + (fitted[i]  - meanF)*(fitted[i]  - meanF);
   262         covYF = covYF + (ysignal[i] - meanY)*(fitted[i]  - meanF);
   264     if ((sumYY == 0) || (sumFF == 0))
   267         return covYF*covYF/(sumYY*sumFF);
   270 template< 
typename TYPE >
   271 int KWUtil::linearFit(
   291     TYPE Sx = KWUtil::calcSumArray(nSamples, datax);
   292     TYPE Sy = KWUtil::calcSumArray(nSamples, datay);
   296     for (
size_t i = 0; i < nSamples; i++){
   297         TYPE t = datax[i] - Sx/nSamples;
   302     a = (Sy - Sx * b) / nSamples;
   305     for (
size_t i = 0; i < nSamples; i++){
   306         chi2 += (datay[i] - a - b * datax[i]) * (datay[i] - a - b * datax[i]);
   309     if (nSamples > 2) sigdat = std::sqrt(chi2 / (nSamples - 2));
   310     siga = sigdat * std::sqrt((1 + Sx * Sx / (nSamples * St2)) / nSamples);
   311     sigb = sigdat * std::sqrt(1 / St2);
   314     TYPE *fitted = 
new TYPE[nSamples];
   315     for (
size_t i = 0; i < nSamples; i++){
   316         fitted[i] = a + b * datax[i];
   318     R2 = KWUtil::calcR2cor(nSamples, fitted, datay);
   324 template< 
typename TYPE >
   325 double KWUtil::SKPLinReg(
const TYPE *datax, 
const TYPE *datay, 
int nSamples, TYPE &rslope, TYPE &roffset){
   327     TYPE yt, xt, syy = 0.0, sxy = 0.0, sxx = 0.0, ay = 0.0, ax = 0.0;
   328     if(nSamples<2) 
return(0.0); 
   329     for (
long j = 0; j < nSamples; j++) 
   336     for (
long j = 0; j < nSamples; j++)
   353     roffset = ay-rslope*ax;
   354     return (sxy/sqrt(sxx*syy));   
   357 template< 
typename TYPE >
   358 void KWUtil::SKPsort(
int nSamples, 
const TYPE *myarray, 
int *index){
   362     for (j=1;j<=nSamples;j++) index[j]=j;
   363     if (nSamples == 1) 
return;
   364     l=(nSamples >> 1) + 1;
   369             q=myarray[(indxt=index[--l])];
   371             q=myarray[(indxt=index[ir])];
   381             if (j < ir && myarray[index[j]] < myarray[index[j+1]]) j++;
   382             if (q < myarray[index[j]]) {
   392 template< 
typename TYPE >
   393 void KWUtil::quickSort(
int nSamples, TYPE *myarray){
   394     KWUtil::quickSort(myarray, 0, nSamples-1);
   397 template< 
typename TYPE >
   398 void KWUtil::quickSortIndex(
int nSamples, TYPE *myarray, 
int *indexArray){
   399     for (
int i = 0; i < nSamples; i++){
   402     KWUtil::quickSortIndex(myarray, indexArray, 0, nSamples-1);
   406 template< 
typename TYPE >
   407 void KWUtil::quickSort(TYPE arr[], 
int left, 
int right) {
   409     int i = left, j = right;
   411     TYPE pivot = arr[(left + right) / 2];
   415         while (arr[i] < pivot)
   417         while (arr[j] > pivot)
   430         quickSort(arr, left, j);
   432         quickSort(arr, i, right);
   435 template< 
typename TYPE >
   436 void KWUtil::quickSortIndex(TYPE arr[], 
int indexArr[], 
int left, 
int right) {
   438     int i = left, j = right, tmpIdx;
   440     TYPE pivot = arr[(left + right) / 2];
   444         while (arr[i] < pivot)
   446         while (arr[j] > pivot)
   454             tmpIdx = indexArr[i];
   455             indexArr[i] = indexArr[j];
   456             indexArr[j] = tmpIdx;
   464         quickSortIndex(arr, indexArr, left, j);
   466         quickSortIndex(arr, indexArr, i, right);
   469 template< 
typename TYPE >
   470 void KWUtil::printKW(
bool doPrint, 
char* fmt, ...){
   479 template< 
typename TYPE >
   480 TYPE KWUtil::calcFeFromT2(TYPE T2){
   481     return 45 * std::pow(T2, -1.22);
   484 template< 
typename TYPE >
   485 TYPE KWUtil::calcFeErrorFromT2(TYPE T2, TYPE deltaT2){
   486     return  45 * 1.22 * std::pow(T2, -2.22) * deltaT2;
   488 template< 
typename TYPE >
   489 int KWUtil::calculateFitError(
int nSamples, 
int nDims, 
const TYPE* jacobian, TYPE mFuncNorm, TYPE* fitError){
   491     TYPE* g = 
new TYPE[nDims*nDims];
   492     TYPE* g_inv = 
new TYPE[nDims*nDims];
   493     for (
int i = 0; i < nDims; i++){
   494         for (
int j = 0; j < nDims; j++){
   495             g[j + i * nDims] = 0;
   496             for (
int k = 0; k < nSamples; k++){
   497                 g[j + i * nDims] += jacobian[i + k * nDims] * jacobian[j + k * nDims];
   510         for (
int i = 0; i < nDims; i++){
   511             int pos = i * nDims + i;
   512             fitError[i] = mFuncNorm * sqrt(g_inv[pos]/(nSamples-nDims));
   521 template< 
typename TYPE >
   524     for (
int i = 0; i < 4; ++i){
   525         matrixInverse[i] = 0;
   528     const TYPE *a = matrix; 
   529     TYPE det = a[0] * a[3] - a[1] * a[2];
   530     if (fabs(det) < std::numeric_limits<TYPE>::min() || det==0)
   533     matrixInverse[0] =  a[3]/det;
   534     matrixInverse[1] = -a[1]/det;
   535     matrixInverse[2] = -a[2]/det;
   536     matrixInverse[3] =  a[0]/det;
   541 template< 
typename TYPE >
   544     for (
int i = 0; i < 9; ++i){
   545         matrixInverse[i] = 0;
   548     const TYPE *a = matrix; 
   549     TYPE det = a[0]*a[4]*a[8] - a[0]*a[5]*a[7] - a[1]*a[3]*a[8] + a[1]*a[5]*a[6] + a[2]*a[3]*a[7] - a[2]*a[4]*a[6];
   551     if (fabs(det) < std::numeric_limits<TYPE>::min())
   554     matrixInverse[0] =  (a[4]*a[8] - a[5]*a[7])/det;
   555     matrixInverse[1] = -(a[1]*a[8] - a[2]*a[7])/det;
   556     matrixInverse[2] =  (a[1]*a[5] - a[2]*a[4])/det;
   557     matrixInverse[3] = -(a[3]*a[8] - a[5]*a[6])/det;
   558     matrixInverse[4] =  (a[0]*a[8] - a[2]*a[6])/det;
   559     matrixInverse[5] = -(a[0]*a[5] - a[2]*a[3])/det;
   560     matrixInverse[6] =  (a[3]*a[7] - a[4]*a[6])/det;
   561     matrixInverse[7] = -(a[0]*a[7] - a[1]*a[6])/det;
   562     matrixInverse[8] =  (a[0]*a[4] - a[1]*a[3])/det;
   567 template< 
typename TYPE >
   568 TYPE KWUtil::getChiSqrt(TYPE lastFValue, 
int nSamples){
   569     return sqrt(lastFValue/(nSamples-1));
   572 template< 
typename TYPE >
   573 TYPE KWUtil::MOLLI_min(TYPE a[], 
int n, 
int *indm)
   578     for (i=0;i<n;i++)if(mval>a[i]){*indm=i;mval=a[i];};
   582 template< 
typename TYPE >
   583 TYPE KWUtil::MOLLI_max(TYPE a[], 
int n, 
int *indm)
   588     for (i=0;i<n;i++)
if(mval<a[i]){*indm=i;mval=a[i];};
   592 template< 
typename TYPE >
   593 TYPE KWUtil::dicomTime2Seconds(std::string dicomTimeString){
   594     TYPE dicomTimeSeconds = 0;
   596     if (dicomTimeString.length() < 1) {
   598         return dicomTimeSeconds; 
   601     if (dicomTimeString.length() != 6 && dicomTimeString[6] != 
'.'){
   602         printf(
"ERROR: Dicom string should have a dot at the sixth index");
   603         return dicomTimeSeconds; 
   606     std::string hours = dicomTimeString.substr(0,2);
   607     std::string minutes = dicomTimeString.substr(2,2);
   608     std::string seconds = dicomTimeString.substr(4,2);
   609     std::string milliseconds = 
"0";
   610     if (dicomTimeString.length() > 6) {
   611         milliseconds = dicomTimeString.substr(6, dicomTimeString.length()-6);
   614     TYPE hoursInSeconds = 60 * 60 * KWUtil::StringToNumber<TYPE>(hours);
   615     TYPE minutesInSeconds = 60 * KWUtil::StringToNumber<TYPE>(minutes);
   616     TYPE secondsInSeconds = 1 *KWUtil::StringToNumber<TYPE>(seconds);
   617     TYPE millisecondsInSeconds = KWUtil::StringToNumber<TYPE>(milliseconds);
   619     dicomTimeSeconds = hoursInSeconds + minutesInSeconds + secondsInSeconds + millisecondsInSeconds;
   621     return dicomTimeSeconds;
   626 template < 
typename TYPE >
   627 std::vector<int> KWUtil::bounds(
int parts, 
int mem) {
   629     int delta = mem / parts;
   630     int reminder = mem % parts;
   633     for (
int i = 0; i < parts; ++i) {
   643 template < 
typename TYPE >
   644 bool KWUtil::array_expect_near(
   649         const std::string& comment) {
   650     for (
int i = 0; i < nElements; i ++){
   651         TYPE abs_diff = std::abs(array1[i] - array2[i]);
   652         if ( abs_diff > abs_error){
   653             std::cout << std::setprecision(std::numeric_limits<double>::digits10 + 1) <<
   654                       "The difference between array1 and array2 at element "   655                       << i << 
" evaluates to " << abs_diff << 
" which exceeds tolerance, where\n"   656                       << 
"array1[" << i << 
"] evaluates to " << array1[i] << 
"\n"   657                       << 
"array2[" << i << 
"] evaluates to " << array2[i] << 
"\n"   658                       << 
"tolerance evaluates to " << abs_error << 
"\n"   659                       << comment << std::endl;
 static void printVectorNewline(const std::string &name, const std::vector< TYPE > vector)
Definition: KWUtil.hxx:44
 
static void printVector(const std::string &name, const std::vector< TYPE > vector)
Definition: KWUtil.hxx:35
 
static int calcMatrixInverse3x3(const TYPE *matrix, TYPE *matrixInverse)
Definition: KWUtil.hxx:542
 
static int calcMatrixInverse2x2(const TYPE *matrix, TYPE *matrixInverse)
Definition: KWUtil.hxx:522