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