4898794edd81be5285ea6e544acbedeaeb31bf78 max Tue Nov 23 08:10:57 2021 -0800 Fixing pointers to README file for license in all source code files. refs #27614 diff --git src/lib/aveStats.c src/lib/aveStats.c index 843f4a8..0d96da2 100644 --- src/lib/aveStats.c +++ src/lib/aveStats.c @@ -1,84 +1,84 @@ /* Copyright (C) 2016 The Regents of the University of California - * See README in this or parent directory for licensing information. */ + * See kent/LICENSE or http://genome.ucsc.edu/license/ for licensing information. */ #include "common.h" #include "aveStats.h" static int cmpDouble(const void *va, const void *vb) /* Compare two doubles. */ { const double *a = va; const double *b = vb; double diff = *a - *b; if (diff < 0) return -1; else if (diff > 0) return 1; else return 0; } static inline double calcMedian(double *array, int count) /* Calculate the median of a list of numbers. */ { // if the array has an odd number of elements choose the center element if (count & 1) return array[count / 2]; // return the mean of the two central elements if the number of elements is even return (array[count/2 - 1] + array[count/2]) / 2.0; } struct aveStats *aveStatsCalc(double *array, unsigned count) /* Compute statistics on an unsorted array of doubles. Use Tukey hinge method for quartiles. */ { struct aveStats *as; AllocVar(as); as->count = count; // special case for arrays of size 0 and 1 if (count == 0) return as; else if (count == 1) { as->q1 = as->median = as->q3 = as->average = as->minVal = as->maxVal = as->total = array[0]; as->var = as->stdDev = 0.0; return as; } qsort(array, count, sizeof array[0], cmpDouble); as->minVal = array[0]; as->maxVal = array[count-1]; double *lastValue = &array[count]; double *valuePtr; double total = 0; for( valuePtr = array; valuePtr < lastValue; valuePtr++) total += *valuePtr; as->total = total; double average; as->average = average = total/count; double oneVar, totalVar = 0; for( valuePtr = array; valuePtr < lastValue; valuePtr++) { oneVar = (average - *valuePtr); totalVar += oneVar * oneVar; } as->var = totalVar; as->var /= count-1; // use sample standard deviation as->stdDev = sqrt(as->var); as->median = calcMedian(array, count); unsigned halfSize = count/2 + (count & 1); as->q1 = calcMedian(array, halfSize); as->q3 = calcMedian(&array[count/2], halfSize); return as; }