+ m->se_mean = sqrt (m->var / m->n) ;
+
+
+
+ m->wvp = (struct weighted_value **) hsh_sort(m->ordered_data);
+ m->n_data = hsh_count(m->ordered_data);
+
+ /* Trimmed mean calculation */
+ if ( m->n_data <= 1 )
+ {
+ m->trimmed_mean = m->mean;
+ return;
+ }
+
+ m->histogram = histogram_create(10, m->min, m->max);
+
+ for ( i = 0 ; i < m->n_data ; ++i )
+ {
+ struct weighted_value **wv = (m->wvp) ;
+ gsl_histogram_accumulate(m->histogram, wv[i]->v.f, wv[i]->w);
+ }
+
+ tc = m->n * 0.05 ;
+ k1 = -1;
+ k2 = -1;
+
+ for ( i = 0 ; i < m->n_data ; ++i )
+ {
+ cc += m->wvp[i]->w;
+ m->wvp[i]->cc = cc;
+
+ m->wvp[i]->rank = j + (m->wvp[i]->w - 1) / 2.0 ;
+
+ j += m->wvp[i]->w;
+
+ if ( cc < tc )
+ k1 = i;
+ }
+
+
+
+ k2 = m->n_data;
+ for ( i = m->n_data -1 ; i >= 0; --i )
+ {
+ if ( tc > m->n - m->wvp[i]->cc)
+ k2 = i;
+ }
+
+
+ /* Calculate the percentiles */
+ ptiles(m->ptile_hash, m->wvp, m->n_data, m->n, m->ptile_alg);
+
+ tukey_hinges(m->wvp, m->n_data, m->n, m->hinge);
+
+ /* Special case here */
+ if ( k1 + 1 == k2 )
+ {
+ m->trimmed_mean = m->wvp[k2]->v.f;
+ return;
+ }
+
+ m->trimmed_mean = 0;
+ for ( i = k1 + 2 ; i <= k2 - 1 ; ++i )
+ {
+ m->trimmed_mean += m->wvp[i]->v.f * m->wvp[i]->w;
+ }
+
+
+ m->trimmed_mean += (m->n - m->wvp[k2 - 1]->cc - tc) * m->wvp[k2]->v.f ;
+ m->trimmed_mean += (m->wvp[k1 + 1]->cc - tc) * m->wvp[k1 + 1]->v.f ;
+ m->trimmed_mean /= 0.9 * m->n ;
+
+
+}