+char solexa2phred( char score )
+{
+ /* Martin A. Hansen, September 2009 */
+
+ /* Converts an octal score in the Solexa range to an octal score */
+ /* in the Pred range, which is returned. */
+
+ int dec = 0;
+ char c = 0;
+
+ dec = solexa2dec( score );
+ c = dec2phred( c );
+
+ return c;
+}
+
+
+char phred2solexa( char score )
+{
+ /* Martin A. Hansen, September 2009 */
+
+ /* Converts an octal score in the Solexa range to an octal score */
+ /* in the Pred range, which is returned. */
+
+ int dec = 0;
+ char c = 0;
+
+ dec = phred2dec( score );
+ c = dec2solexa( c );
+
+ return c;
+}
+
+
+void solexa_str2phred_str( char *scores )
+{
+ /* Martin A. Hansen, September 2009 */
+
+ /* Converts a string of Solexa octal scores to Phred octal scores in-line. */
+
+ int i = 0;
+
+ for ( i = 0; i < strlen( scores ); i++ ) {
+ scores[ i ] = solexa2phred( scores[ i ] );
+ }
+}
+
+
+void phred_str2solexa_str( char *scores )
+{
+ /* Martin A. Hansen, September 2009 */
+
+ /* Converts a string of Phred octal scores to Solexa octal scores in-line. */
+
+ int i = 0;
+
+ for ( i = 0; i < strlen( scores ); i++ ) {
+ scores[ i ] = phred2solexa( scores[ i ] );
+ }
+}
+
+
+double phred_str_mean( char *scores )
+{
+ /* Martin A. Hansen, November 2009 */
+
+ /* Calculates the mean score as a float which is retuned. */
+
+ int len = 0;
+ int i = 0;
+ int sum = 0;
+ double mean = 0.0;
+
+ len = strlen( scores );
+
+ for ( i = 0; i < len; i++ ) {
+ sum += phred2dec( scores[ i ] );
+ }
+
+ mean = ( double ) sum / ( double ) len;
+
+ return mean;
+}
+
+
+double solexa_str_mean( char *scores )
+{
+ /* Martin A. Hansen, November 2009 */
+
+ /* Calculates the mean score as a float which is retuned. */
+
+ int len = 0;
+ int i = 0;
+ int sum = 0;
+ double mean = 0.0;
+
+ len = strlen( scores );
+
+ for ( i = 0; i < len; i++ ) {
+ sum += solexa2dec( scores[ i ] );
+ }
+
+ mean = ( double ) sum / ( double ) len;
+
+ return mean;
+}
+
+
+double solexa_str_mean_window( char *scores, int window_size, double min )
+{
+ /* Martin A. Hansen, June 2010. */
+
+ /* Scans a score string by running a sliding window across */
+ /* the string and for each position calculate the mean score */
+ /* for the window. Terminates and returns mean score if this */
+ /* is lower than a given minimum otherwise the smallest mean */
+ /* score is returned. */
+
+ int i = 0;
+ double sum = 0;
+ double mean = 0.0;
+
+ if ( window_size > strlen( scores ) )
+ {
+ fprintf( stderr, "ERROR: window_size > scores string: %d > %d\n\n", window_size, strlen(scores) );
+ exit( 1 );
+ }
+
+ /* ---- fill up window ---- */
+
+ for ( i = 0; i < window_size; i++ ) {
+ sum += solexa2dec( scores[ i ] );
+ }
+
+ mean = sum / window_size;
+
+ if ( mean < min ) {
+ return mean;
+ }
+
+ /* --- scan the rest of the scores ---- */
+
+ while ( i < strlen( scores ) )
+ {
+ sum += solexa2dec( scores[ i ] );
+ sum -= solexa2dec( scores[ i - window_size ] );
+
+ mean = ( mean < sum / window_size ) ? mean : sum / window_size;
+
+ // printf( "char->%c score->%d sum->%f mean->%f\n", scores[i], solexa2dec(scores[i]),sum, mean);
+
+ if ( mean < min ) {
+ return mean;
+ }
+
+ i++;
+ }
+
+ return mean;
+}
+
+
+void softmask_solexa_str( char *seq, char *scores, int threshold )