Mercurial > repos > dawe > srf2fastq
diff srf2fastq/io_lib-1.12.2/io_lib/misc_scf.c @ 0:d901c9f41a6a default tip
Migrated tool version 1.0.1 from old tool shed archive to new tool shed repository
author | dawe |
---|---|
date | Tue, 07 Jun 2011 17:48:05 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/srf2fastq/io_lib-1.12.2/io_lib/misc_scf.c Tue Jun 07 17:48:05 2011 -0400 @@ -0,0 +1,282 @@ +/* + * Copyright (c) Medical Research Council 1994. All rights reserved. + * + * Permission to use, copy, modify and distribute this software and its + * documentation for any purpose is hereby granted without fee, provided that + * this copyright and notice appears in all copies. + * + * This file was written by James Bonfield, Simon Dear, Rodger Staden, + * as part of the Staden Package at the MRC Laboratory of Molecular + * Biology, Hills Road, Cambridge, CB2 2QH, United Kingdom. + * + * MRC disclaims all warranties with regard to this software. + */ + +/* + Title: misc_scf.c + + Purpose: misc handling of Standard Chromatogram Format sequences + Last update: August 18 1994 + + Change log: + 18 Aug 1994 Creation from bits of {read,write}scf.c and new code. + +*/ + +#include <stdio.h> +#include <string.h> + +#include "io_lib/scf.h" +#include "io_lib/mach-io.h" +#include "io_lib/xalloc.h" + +#include "io_lib/stdio_hack.h" + +float scf_version_str2float(char version[]) +{ + char v[5]; + strncpy(v,version,4);v[4]='\0'; + if (strspn(v,"0123456789. ")!=4) return 0.0; + return (float)atof(v); +} + +char *scf_version_float2str(float f) +{ + static char v[5]; + + sprintf(v, "%1.2f", f); + return v; +} + + +/* + * Allocates memory for the scf elements based upon arguments passed. + * Returns; + * Scf * - Success. The scf structure and it's samples, bases, + * and comments fields have been allocated. + * NULL - Failure. + */ +Scf *scf_allocate(int num_samples, int sample_size, int num_bases, + int comment_size, int private_size) { + Scf *scf; + + scf = (Scf *)xcalloc(1, sizeof(Scf)); + if (NULL == scf) + return NULL; + + /* bases - +1 as a safety guard for when num_bases==0 */ + scf->bases = (Bases *)xcalloc(sizeof(Bases), num_bases+1); + if (NULL == scf->bases) + return NULL; + + /* samples */ + scf->header.sample_size = sample_size; + if (scf->header.sample_size == 1) { + scf->samples.samples1 = (Samples1 *)xmalloc(num_samples * + sizeof(Samples1) + 1); + } else { + scf->samples.samples2 = (Samples2 *)xmalloc(num_samples * + sizeof(Samples2) + 1); + } + if (NULL == scf->samples.samples1) { + xfree(scf->bases); + xfree(scf); + return NULL; + } + + /* comments */ + if (comment_size) { + scf->comments = (Comments *)xmalloc(sizeof(Comments) * + (comment_size + 1)); + if (NULL == scf->comments) { + xfree(scf->bases); + xfree(scf->samples.samples1); + xfree(scf); + return NULL; + } + } else + scf->comments = NULL; + + /* private data */ + if (private_size) { + scf->private_data = (char *)xmalloc(private_size); + if (NULL == scf->private_data) { + xfree(scf->bases); + xfree(scf->samples.samples1); + if (scf->comments) xfree(scf->comments); + xfree(scf); + return NULL; + } + } else + scf->private_data = NULL; + + return scf; +} + +void scf_deallocate(Scf *scf) { + xfree(scf->bases); + xfree(scf->samples.samples1); + if (scf->comments) + xfree(scf->comments); + if (scf->private_data) + xfree(scf->private_data); + xfree(scf); +} + + +int is_scf(char *fn) +/* + * Check to see if file with name `fn' is in SCF format + * + * Returns: + * 1 - is SCF format + * 0 - not SCF format + *-1 - failure + */ +{ + FILE *fp; + uint_4 magic; + int ok; + + if ( (fp=fopen(fn,"rb")) == NULL) { + ok = -1; + } else { + if ( be_read_int_4(fp, &magic) != 1 ) { + ok = 0; + } else { + ok = (magic==SCF_MAGIC); + } + fclose(fp); + } + + return ok; +} + +void scf_delta_samples1 ( int1 samples[], int num_samples, int job) { + + /* If job == DELTA_IT: + change a series of sample points to a series of delta delta values: + ie change them first: delta = current_value - previous_value + then delta_delta = delta - previous_delta + + else + do the reverse + */ + + int i; + + if ( DELTA_IT == job ) { +#ifdef CLEAR_BUT_SLOW + int1 p_delta, p_sample; + + p_delta = 0; + for (i=0;i<num_samples;i++) { + p_sample = samples[i]; + samples[i] = samples[i] - p_delta; + p_delta = p_sample; + } + p_delta = 0; + for (i=0;i<num_samples;i++) { + p_sample = samples[i]; + samples[i] = samples[i] - p_delta; + p_delta = p_sample; + } +#else + for (i = num_samples-1 ; i > 1; i--) { + samples[i] = samples[i] - 2*samples[i-1] + samples[i-2]; + } + samples[1] = samples[1] - 2*samples[0]; +#endif + + } else { + +#ifdef CLEAR_BUT_SLOW + int1 p_sample; + + p_sample = 0; + for (i=0;i<num_samples;i++) { + samples[i] = samples[i] + p_sample; + p_sample = samples[i]; + } + p_sample = 0; + for (i=0;i<num_samples;i++) { + samples[i] = samples[i] + p_sample; + p_sample = samples[i]; + } +#else + int1 p_sample1, p_sample2; + + p_sample1 = p_sample2 = 0; + for (i = 0; i < num_samples; i++) { + p_sample1 = p_sample1 + samples[i]; + samples[i] = p_sample1 + p_sample2; + p_sample2 = samples[i]; + } +#endif + } +} + +void scf_delta_samples2 ( uint_2 samples[], int num_samples, int job) { + + /* If job == DELTA_IT: + change a series of sample points to a series of delta delta values: + ie change them first: delta = current_value - previous_value + then delta_delta = delta - previous_delta + + else + do the reverse + */ + + register int i; + + if ( DELTA_IT == job ) { +#ifdef CLEAR_BUT_SLOW + register uint_2 p_delta, p_sample; + + p_delta = 0; + for (i=0;i<num_samples;i++) { + p_sample = samples[i]; + samples[i] = samples[i] - p_delta; + p_delta = p_sample; + } + p_delta = 0; + for (i=0;i<num_samples;i++) { + p_sample = samples[i]; + samples[i] = samples[i] - p_delta; + p_delta = p_sample; + } +#else + for (i = num_samples-1 ; i > 1; i--) { + samples[i] = samples[i] - 2*samples[i-1] + samples[i-2]; + } + samples[1] = samples[1] - 2*samples[0]; +#endif + + } else { + +#ifdef CLEAR_BUT_SLOW + register uint_2 p_sample; + + p_sample = 0; + for (i=0;i<num_samples;i++) { + samples[i] = samples[i] + p_sample; + p_sample = samples[i]; + } + p_sample = 0; + for (i=0;i<num_samples;i++) { + samples[i] = samples[i] + p_sample; + p_sample = samples[i]; + } +#else + uint_2 p_sample1, p_sample2; + + p_sample1 = p_sample2 = 0; + for (i = 0; i < num_samples; i++) { + p_sample1 = p_sample1 + samples[i]; + samples[i] = p_sample1 + p_sample2; + p_sample2 = samples[i]; + } +#endif + } +} +