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
+    }
+}
+