From 62fa81367832267c37d7f78dced39d0fc4985079 Mon Sep 17 00:00:00 2001 From: Justin S <3630356+codeandkey@users.noreply.github.com> Date: Wed, 15 May 2019 15:55:10 -0500 Subject: [PATCH] recon: new package at 1.08 (#11408) * recon: new package at 1.08 * recon: add period * recon: use proper decorators, better documentation * recon: fix incorrect os import * recon: add repeatmasker patch as variant --- .../repos/builtin/packages/recon/package.py | 52 ++ .../packages/recon/repeatmasker_recon.patch | 583 ++++++++++++++++++ 2 files changed, 635 insertions(+) create mode 100644 var/spack/repos/builtin/packages/recon/package.py create mode 100644 var/spack/repos/builtin/packages/recon/repeatmasker_recon.patch diff --git a/var/spack/repos/builtin/packages/recon/package.py b/var/spack/repos/builtin/packages/recon/package.py new file mode 100644 index 0000000000..860e2b7ba0 --- /dev/null +++ b/var/spack/repos/builtin/packages/recon/package.py @@ -0,0 +1,52 @@ +# Copyright 2013-2019 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (Apache-2.0 OR MIT) + +from spack import * +from os import symlink + + +class Recon(MakefilePackage): + """RECON: a package for automated de novo identification of repeat families + from genomic sequences.""" + + homepage = "http://eddylab.org/software/recon/" + url = "http://eddylab.org/software/recon/RECON1.05.tar.gz" + + version('1.05', sha256='4d4f76f439bcffd50380cffc41a80dc15fa4a80f38a04234e24da893ed7c025a') + + variant('repeatmasker', default=False, + description='Use RepeatMasker developer patches (1.08)') + + patch('repeatmasker_recon.patch', when='+repeatmasker') + + build_directory = 'src' + + depends_on('perl', type='run') + + @property + def install_targets(self): + return [ + 'install', + 'BINDIR=%s' % self.prefix.bin + ] + + # edit the recon.pl script with the prefix as mentioned in the README + def edit(self, spec, prefix): + filter_file('$path = ""', '$path = "%s"' % prefix.bin, + 'scripts/recon.pl', string=True) + + # recon's makefile is very basic -- the target directory must + # already exist to properly install + @run_before('install') + def prepare_bin(self): + mkdirp(prefix.bin) + + # finally, install the scripts dir as well + # and link the recon command into bin. + @run_after('install') + def finalize(self): + install_tree('scripts', prefix.scripts) + symlink(join_path(prefix.scripts, 'recon.pl'), + join_path(prefix.bin, 'recon')) diff --git a/var/spack/repos/builtin/packages/recon/repeatmasker_recon.patch b/var/spack/repos/builtin/packages/recon/repeatmasker_recon.patch new file mode 100644 index 0000000000..ed20cc070d --- /dev/null +++ b/var/spack/repos/builtin/packages/recon/repeatmasker_recon.patch @@ -0,0 +1,583 @@ +diff -ruN RECON1.05/00README RECON-1.08/00README +--- RECON1.05/00README 2002-04-08 14:31:59.000000000 -0500 ++++ RECON-1.08/00README 2014-02-05 16:05:18.000000000 -0600 +@@ -1,6 +1,7 @@ + RECON -- finding repeat families from biological sequences +-Version 1.03 (Mar 2002) ++Version 1.08 (Jan 2014) + Copyright (C) 2001 Washington University School of Medicine ++Copyright (C) 2011-2014 Institute for Systems Biology + ------------------------------------------------------------------ + + +@@ -28,8 +29,26 @@ + + What's new? + ++RECON1.08: Wed Feb 5 14:04:25 PST 2014 - Robert Hubley ISB ++ - New checks in eleredef.c for failed memory allocation/file operations. ++ - A buffer overrun bug fix provided by Stephen Ficklin in eledef.c. ++ ++RECON1.07: Wed Jun 8 10:00:55 PDT 2011 - Robert Hubley ISB ++ - Another problem with the eleredef program has appeared a couple ++ of times. A divide by zero error in one of Zhirong's routines. ++ I have applied a workaround to the divide by zero but not a fix ++ to the real problem. The program will now warn the user if ++ the workaround was exercised during a run. ++ ++RECON1.06: Tue May 20 15:19:30 PDT 2008 - Robert Hubley ISB ++ - 64 bit compiler fixes: Previous versions of RECON used the "long" ++ data type under the assumption that was 32bits. This caused the ++ program to crash or lock up during analysis. ++ + Bug fix for RECON1.02 in the eleredef program. + ++ ++ + Programs and input + + The RECON algorithm defines repeat families on the basis of pairwise +@@ -50,7 +69,6 @@ + multiple times and concatenate the result into one MSP file. + + +- + The recon script drives the running of the package. The command + line format is as follows: + +diff -ruN RECON1.05/src/bolts.h RECON-1.08/src/bolts.h +--- RECON1.05/src/bolts.h 2002-01-10 15:19:09.000000000 -0600 ++++ RECON-1.08/src/bolts.h 2014-02-05 16:05:18.000000000 -0600 +@@ -10,5 +10,5 @@ + + + +-long seq_no; ++int32_t seq_no; + char **seq_names; +diff -ruN RECON1.05/src/edgeredef.c RECON-1.08/src/edgeredef.c +--- RECON1.05/src/edgeredef.c 2002-07-19 10:42:03.000000000 -0500 ++++ RECON-1.08/src/edgeredef.c 2014-02-05 16:05:18.000000000 -0600 +@@ -58,6 +58,10 @@ + } + + log_file = fopen("tmp2/log", "w"); ++ if (!log_file) { ++ printf("Can not open log_file. Exiting\n"); ++ exit(1); ++ } + + while (fgets(line, 15, ele_no)) { + ele_ct = atoi(line); +@@ -191,7 +195,7 @@ + } else { + ele_info->stat = 'y'; + ele_cleanup(&ele_info->ele); +- command = (char *) malloc(30*sizeof(char)); ++ command = (char *) malloc(80*sizeof(char)); + sprintf(command, "cp tmp/e%d tmp2/.", ele_info->index); + system(command); + free(command); +diff -ruN RECON1.05/src/eledef.c RECON-1.08/src/eledef.c +--- RECON1.05/src/eledef.c 2002-01-10 15:19:10.000000000 -0600 ++++ RECON-1.08/src/eledef.c 2014-02-05 16:05:18.000000000 -0600 +@@ -385,7 +385,7 @@ + + void img_charge(IPROT_t **shadow, int ct, FILE *input) { + int i=0, pos=0; +- char line[100]; ++ char line[151]; + int scan_flag; + MSP_t msp; + +diff -ruN RECON1.05/src/ele.h RECON-1.08/src/ele.h +--- RECON1.05/src/ele.h 2002-01-10 15:19:09.000000000 -0600 ++++ RECON-1.08/src/ele.h 2014-02-05 16:05:18.000000000 -0600 +@@ -1,7 +1,6 @@ + #include "msps.h" + + +- + #define SIZE_LIMIT 500 + #define TANDEM 5 + +@@ -9,13 +8,13 @@ + + + typedef struct cp_list { +- long cp; ++ int32_t cp; + struct ele_info *contributor; + struct cp_list *next; + } CP_t; + + typedef struct bd_list { +- long bd; ++ int32_t bd; + int support; + struct bd_list *next; + } BD_t; +@@ -24,7 +23,7 @@ + int index; + char type; /* 'p', 's', 'c' */ + int direction; /* for clustering elements in consistent directions */ +- long score; /* for edge_filt, to solve the PPS problem */ ++ int32_t score; /* for edge_filt, to solve the PPS problem */ + struct ele_info *ele1_info, *ele2_info; + } EDGE_t; + +@@ -67,6 +66,7 @@ + struct ele_list *next; + } ELE_DATA_t; + ++ + typedef struct family { + int index; + char name[10]; +@@ -139,21 +139,45 @@ + void frag_data_free(FRAG_DATA_t **); + void frag_data_cleanup(FRAG_DATA_t **); + +- ++void print_ele_info(ELE_INFO_t *rt); ++void print_ele_data(ELE_DATA_t *rt); + + /*MSP_DATA_t *all_msps=NULL; + EDGE_t *efav=NULL;*/ + ELE_INFO_t **all_ele; + int ele_ct, ele_array_size, fam_ct; + int clan_size, clan_core_size; +-long msp_in_mem, msp_left, msp_ct, msp_index; +-long edge_index, edge_in_mem, edge_left, edge_ct; +-long files_read, clan_ct, err_no; ++int32_t msp_in_mem, msp_left, msp_ct, msp_index; ++int32_t edge_index, edge_in_mem, edge_left, edge_ct; ++int32_t files_read, clan_ct, err_no; + ELE_INFO_t *ele_info_data, *ele_info_tail; + FAM_DATA_t *FAMs; + FILE *err, *new_msps, *eles, *unproc, *combo, *obs, *fams, *log_file; + + ++/*************** ++ * DEBUG * ++ ***************/ ++ ++void print_ele_data(ELE_DATA_t *rt) { ++ if (!rt) return; ++ print_ele_info( rt->ele_info ); ++ if (rt->next) ++ print_ele_data(rt->next); ++} ++ ++void print_ele_info(ELE_INFO_t *rt) { ++ if (!rt) return; ++ printf("ele: index=%d, stat=%c, file_update=%d", rt->index, rt->stat, ++ rt->file_updated ); ++ if ( rt->to_family ) ++ printf(" family_index=%d,", rt->to_family->index ); ++ if ( rt->ele ) ++ printf(" ele_index=%d", rt->ele->index ); ++ else ++ printf(" ele=NULL"); ++ printf("\n"); ++} + + + +@@ -1341,7 +1365,7 @@ + + + +- ++/* Unused */ + void msp_data_free(MSP_DATA_t **md) { + MSP_DATA_t *cur, *next; + +diff -ruN RECON1.05/src/eleredef.c RECON-1.08/src/eleredef.c +--- RECON1.05/src/eleredef.c 2002-03-22 14:01:54.000000000 -0600 ++++ RECON-1.08/src/eleredef.c 2014-02-05 16:05:18.000000000 -0600 +@@ -51,7 +51,7 @@ + BD_t *CP_cluster(CP_t *); + void CP_sort(CP_t **); + void BD_sort(BD_t **); +-int span(ELEMENT_t *, long); ++int span(ELEMENT_t *, int32_t); + void TBD_merge(ELEMENT_t *); + + void dissect(ELE_INFO_t *); +@@ -67,16 +67,16 @@ + + void edges_and_cps(ELE_INFO_t *, IMAGE_t **); + int full_length(IMAGE_t *, float); +-void add_CP(CP_t **, long, ELE_INFO_t *); +-void add_edge(ELE_INFO_t *, ELE_INFO_t *, char, long, short); ++void add_CP(CP_t **, int32_t, ELE_INFO_t *); ++void add_edge(ELE_INFO_t *, ELE_INFO_t *, char, int32_t, short); + void adjust_edge_tree(ELE_INFO_t *); + int charge_edge_array(EDGE_t **, EDGE_TREE_t *, int); + int consis_tree_build(IMG_NODE_t *, IMAGE_t *, int); + int consis(IMAGE_t *, IMAGE_t *, float); + IMG_NODE_t **node_entry(IMG_NODE_t **); + void consis_tree_free(IMG_NODE_t *); +-/*int find_prim(struct img_node *, float, long, long, short, long *, short *);*/ +-int find_prim(IMG_NODE_t *, float, long, long, long, long, long, long, long, int *, long *, short *); ++/*int find_prim(struct img_node *, float, int32_t, int32_t, short, int32_t *, short *);*/ ++int find_prim(IMG_NODE_t *, float, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int32_t, int *, int32_t *, short *); + + void combo_output(ELE_INFO_t *); + void obs_output(ELE_INFO_t *); +@@ -90,9 +90,6 @@ + + + +- +- +- + int main (int argc, char *argv[]) { + ELE_INFO_t *cur_ele_info; + int i, ele_march, ei, rounds=0, start; +@@ -125,7 +122,6 @@ + printf("Can not open naive_ele_no. Exiting\n"); + exit(1); + } +- + msp_no = fopen("summary/redef_msp_no", "r"); + if (!msp_no) msp_no = fopen("summary/ori_msp_no", "r"); + if (!msp_no) { +@@ -133,15 +129,46 @@ + exit(1); + } + ++ // May or may not exist. All uses of edge_no first check for ++ // its existence. + edge_no = fopen("summary/naive_edge_no", "r"); ++ ++ // May or may not exist. All uses are checked. + size_list = fopen("tmp/size_list", "r"); ++ ++ // May or may not exist. All uses are checked. + new_stat = fopen("tmp2/redef_stat", "r"); + + new_msps = fopen("summary/new_msps", "a"); ++ if ( !new_msps ) ++ { ++ printf("Can not open summary/new_msps for writing! Exiting\n"); ++ exit(1); ++ } + unproc = fopen("summary/unproc", "a"); ++ if ( !unproc ) ++ { ++ printf("Can not open summary/unproc for writing! Exiting\n"); ++ exit(1); ++ } + combo = fopen("summary/combo", "a"); ++ if ( !combo ) ++ { ++ printf("Can not open summary/combo for writing! Exiting\n"); ++ exit(1); ++ } + obs = fopen("summary/obsolete", "a"); ++ if ( !obs ) ++ { ++ printf("Can not open summary/obsolete for writing! Exiting\n"); ++ exit(1); ++ } + log_file = fopen("tmp2/log", "a"); ++ if ( !log_file ) ++ { ++ printf("Can not open tmp2/log for writing! Exiting\n"); ++ exit(1); ++ } + + while (fgets(line, 15, ele_no)) { + ele_ct = atoi(line); +@@ -170,7 +197,7 @@ + if (size_list && !new_stat) outthrow_big_tandems(size_list); + fclose(unproc); + +- /* set file_updated for ele_info's */ ++ /* set file_updated / stat for ele_info's */ + if (new_stat) { + ele_ct = 0; + while (fgets(line, 35, new_stat)) { +@@ -207,6 +234,12 @@ + /* re-define elements using the syntopy algorithm, and build edges */ + img_ptr = (IMAGE_t **) malloc(MAX_IMG*sizeof(IMAGE_t *)); + ++ if ( ! img_ptr ) ++ { ++ printf("eleredef: Error! Could not allocate memory for img_ptr: %d bytes requested\n", ( MAX_IMG*sizeof(IMAGE_t *) ) ); ++ exit(-1); ++ } ++ + to_march = 1; + while (to_march) { + to_march = 0; +@@ -529,6 +562,11 @@ + fprintf(log_file, "new clan: %d for ele %d\n", clan_ct, ele_info->index); + fflush(log_file); + build_local_network(ele_info, &local_net, &local_net_tail, img_ptr); ++ if ( ele_info->index == 362 || ele_info->index == 10 ) ++ { ++ printf("Printing local net for 362\n"); ++ print_ele_data( local_net ); ++ } + fprintf(log_file, "clan size: %d, clan core size: %d\n", clan_size, clan_core_size); + fflush(log_file); + /* redefining elements in the local network */ +@@ -1136,7 +1174,7 @@ + + #if 0 + BD_t *CP_cluster(CP_t *cps) { +- long first = cps->cp, last = cps->cp, sum = 0; ++ int32_t first = cps->cp, last = cps->cp, sum = 0; + int cpct = 0; + BD_t *bds = NULL, *bd_tmp; + +@@ -1171,7 +1209,7 @@ + + + BD_t *CP_cluster(CP_t *cps) { +- long first = cps->cp, last = cps->cp, sum = 0; ++ int32_t first = cps->cp, last = cps->cp, sum = 0; + CP_t *begin = cps; + int cpct = 0; + BD_t *bds = NULL, *bd_tmp; +@@ -1276,7 +1314,7 @@ + + + +-int span(ELEMENT_t *ele, long cut) { ++int span(ELEMENT_t *ele, int32_t cut) { + /* span requires PCP sorted according to cp_cmp and images sorted according to frag_cmp */ + int left=0, rite=0; + IMG_DATA_t *id; +@@ -1348,18 +1386,20 @@ + dissected = 0; + img_partner = partner(cur_img_data->to_image); + ele_partner = img_partner->ele_info->ele; +- if (full_length(img_partner, CUTOFF2)) ele_partner->flimg_no --; ++ if (full_length(img_partner, CUTOFF2)){ ++ ele_partner->flimg_no --; ++ } + tbd_tmp = cur_ele->TBD; + while (tbd_tmp != NULL) { + if (tbd_tmp->bd > cur_img_data->to_image->frag.lb || !tbd_tmp->next) { + if (tbd_tmp->bd > cur_img_data->to_image->frag.lb && tbd_tmp->bd < cur_img_data->to_image->frag.rb) { + if (tbd_tmp->bd - cur_img_data->to_image->frag.lb <= TOO_SHORT) { +- cur_img_data->to_image->to_msp->score = (long) (cur_img_data->to_image->frag.rb-tbd_tmp->bd+1.)/(cur_img_data->to_image->frag.rb-cur_img_data->to_image->frag.lb+1.)*cur_img_data->to_image->to_msp->score; ++ cur_img_data->to_image->to_msp->score = (int32_t) (cur_img_data->to_image->frag.rb-tbd_tmp->bd+1.)/(cur_img_data->to_image->frag.rb-cur_img_data->to_image->frag.lb+1.)*cur_img_data->to_image->to_msp->score; + if (cur_img_data->to_image->to_msp->direction == 1) img_partner->frag.lb += tbd_tmp->bd - cur_img_data->to_image->frag.lb; + else img_partner->frag.rb -= tbd_tmp->bd - cur_img_data->to_image->frag.lb; + cur_img_data->to_image->frag.lb = tbd_tmp->bd; + } else if (tbd_tmp->bd - cur_img_data->to_image->frag.rb >= -TOO_SHORT) { +- cur_img_data->to_image->to_msp->score = (long) (tbd_tmp->bd-cur_img_data->to_image->frag.lb+1.)/(cur_img_data->to_image->frag.rb-cur_img_data->to_image->frag.lb+1.)*cur_img_data->to_image->to_msp->score; ++ cur_img_data->to_image->to_msp->score = (int32_t) (tbd_tmp->bd-cur_img_data->to_image->frag.lb+1.)/(cur_img_data->to_image->frag.rb-cur_img_data->to_image->frag.lb+1.)*cur_img_data->to_image->to_msp->score; + if (cur_img_data->to_image->to_msp->direction == 1) img_partner->frag.rb -= cur_img_data->to_image->frag.rb - tbd_tmp->bd; + else img_partner->frag.lb += cur_img_data->to_image->frag.rb - tbd_tmp->bd; + cur_img_data->to_image->frag.rb = tbd_tmp->bd; +@@ -1375,8 +1415,11 @@ + target_img = &msp_tmp->sbjct; + target_partner = &msp_tmp->query; + } +- msp_tmp->score = (long) (tbd_tmp->bd-target_img->frag.lb+1.)/(target_img->frag.rb-target_img->frag.lb+1.)*msp_tmp->score; ++ msp_tmp->score = (int32_t) (tbd_tmp->bd-target_img->frag.lb+1.)/(target_img->frag.rb-target_img->frag.lb+1.)*msp_tmp->score; + if (msp_tmp->direction == 1) { ++ // RMH: When tracking down the divide by zero problem I ended up signaling this ++ // spot in the code as the likely place where things went initially wrong. ++ // Explore further. + target_partner->frag.rb -= target_img->frag.rb - tbd_tmp->bd; + } + else { +@@ -1715,7 +1758,7 @@ + ELE_DATA_t *ele_data_tmp; + IMG_DATA_t *scovs; + +- long max_score=0; ++ int32_t max_score=0; + short dir; + + /* sort unprocessed images according to their partner element, and then their left bounds */ +@@ -1862,7 +1905,10 @@ + + + +- ++/* NOTE: Due to the difference in computational precesion between 32bit ++ * and 64 bit processors the following function may return differing ++ * results. ++ */ + int full_length(IMAGE_t *i, float cutoff) { + if (!i->ele_info->ele) { + err_no ++; +@@ -1879,7 +1925,7 @@ + + + +-void add_CP(CP_t **CP_ptr, long cp, ELE_INFO_t *cont) { ++void add_CP(CP_t **CP_ptr, int32_t cp, ELE_INFO_t *cont) { + CP_t *new = (CP_t *) malloc(sizeof(CP_t)); + new->cp = cp; + new->contributor = cont; +@@ -1889,7 +1935,7 @@ + + + +-void add_edge(ELE_INFO_t *ele1_info, ELE_INFO_t *ele2_info, char type, long score, short dir) { ++void add_edge(ELE_INFO_t *ele1_info, ELE_INFO_t *ele2_info, char type, int32_t score, short dir) { + EDGE_t *new = EDGE_malloc(); + int ct; + +@@ -2078,7 +2124,7 @@ + */ + + #if 0 +-int find_prim(IMG_NODE_t *nd, float cutoff, long score, long hist, short which, long *sc, short *d) { ++int find_prim(IMG_NODE_t *nd, float cutoff, int32_t score, int32_t hist, short which, int32_t *sc, short *d) { + IMG_NODE_t *nex_node; + int sum = 0; + short level, further = 0; +@@ -2143,9 +2189,9 @@ + + + +-int find_prim(IMG_NODE_t *nd, float cutoff, long end1, long end2, long efl1, long efl2, long al1, long al2, long score, int *pmarkp, long *sc, short *d) { ++int find_prim(IMG_NODE_t *nd, float cutoff, int32_t end1, int32_t end2, int32_t efl1, int32_t efl2, int32_t al1, int32_t al2, int32_t score, int *pmarkp, int32_t *sc, short *d) { + int sum = 0, mark=0; +- long skip1, skip2, len1, len2; ++ int32_t skip1, skip2, len1, len2; + IMAGE_t *ipt; + + if (nd->sib) sum += find_prim(nd->sib, cutoff, end1, end2, efl1, efl2, al1, al2, score, pmarkp, sc, d); +@@ -2169,7 +2215,7 @@ + efl2 += len2; + al1 += len1; + al2 += len2; +- score += ((long) nd->to_image->to_msp->iden)*(len1+len2)/2; ++ score += ((int32_t) nd->to_image->to_msp->iden)*(len1+len2)/2; + + if (nd->children) { + end1 = nd->to_image->frag.rb; +@@ -2188,6 +2234,16 @@ + if ( (1.0*al1/efl1 > cutoff || 1.0*al2/efl2 > cutoff) && (efl1-al1 < 30 || efl2-al2 < 30) ) { + sum = 1; + mark = 1; ++ if ( (al1+al2) == 0 ) ++ { ++ // RMH: A divide by zero error has occured a few times at this point. ++ // I looked extensively through the code and cannot determine what ++ // is causing this -- although I have a reliable test case to ++ // explore this further. For now this is the only workaround. ++ // If al1 & al2 are zero then simply set them to 1. ++ printf("eleredef warning: Divide by zero averted -- setting al1 to 1.\n"); ++ al1 = 1; ++ } + score = score*2/(al1+al2); + if (score > *sc) { + *sc = score; +diff -ruN RECON1.05/src/Makefile RECON-1.08/src/Makefile +--- RECON1.05/src/Makefile 2002-01-10 15:48:02.000000000 -0600 ++++ RECON-1.08/src/Makefile 2014-02-05 16:05:18.000000000 -0600 +@@ -1,9 +1,7 @@ + # Makefile for ReCon + # + # +- +-VERSION = 1.0 +-VDATE = JUL 2001 ++VERSION = 1.08 + + ## where you want things installed + BINDIR = ../bin +@@ -13,8 +11,8 @@ + #SRCDIR = . + + ## your compiler +-CC = gcc + #CC = cc # for SGI Origin200 compiler# ++CC = gcc + + ## any special compiler flags you want + # -pedantic clashes with -DMEMDEBUG?? +@@ -121,7 +119,5 @@ + + + +- +- + + +diff -ruN RECON1.05/src/msps.h RECON-1.08/src/msps.h +--- RECON1.05/src/msps.h 2002-01-10 15:19:10.000000000 -0600 ++++ RECON-1.08/src/msps.h 2014-02-05 16:05:18.000000000 -0600 +@@ -3,14 +3,13 @@ + #include "bolts.h" + #include "seqlist.h" + +- + /* A collection of structures and functions to handle MSPs */ + + /* BASIC structures */ + + typedef struct frag { + char *seq_name; +- long lb, rb; ++ int32_t lb, rb; + /* char lst, rst; type of ends, can be used to mark physical ends */ + } FRAG_t; + +@@ -44,7 +43,7 @@ + typedef struct msp { + /*struct msp_list *hanger;*/ + char stat; /* 'p', 's' */ +- long score; ++ int32_t score; + float iden; + int direction; + IMAGE_t query, sbjct; +@@ -110,7 +109,7 @@ + + + int scan_msp(MSP_t *m, char *line) { +- long bd_tmp; ++ int32_t bd_tmp; + char qname[NAME_LEN], sname[NAME_LEN]; + int pos; + +@@ -153,7 +152,7 @@ + /* archaine */ + #if 0 + int merge_msp(MSP_t *m1, MSP_t *m2) { /* merge two MSPs into the first one */ +- long l1, l2; ++ int32_t l1, l2; + + /* no need for changing direction */ + /* iden */ +@@ -195,7 +194,7 @@ + + + int sing_cov(FRAG_t *f1, FRAG_t *f2, float cutoff) { +- long l1, l2, l, lb, rb; ++ int32_t l1, l2, l, lb, rb; + if (f1->seq_name == f2->seq_name /*!strncmp(f1->seq_name, f2->seq_name, NAME_LEN)*/) { + l1 = f1->rb - f1->lb; + l2 = f2->rb - f2->lb; +@@ -211,7 +210,7 @@ + + + int doub_cov(FRAG_t *f1, FRAG_t *f2, float cutoff) { +- long l1, l2, l, lb, rb; ++ int32_t l1, l2, l, lb, rb; + if (f1->seq_name == f2->seq_name /*!strncmp(f1->seq_name, f2->seq_name, NAME_LEN)*/) { + l1 = f1->rb - f1->lb; + l2 = f2->rb - f2->lb; +diff -ruN RECON1.05/src/seqlist.h RECON-1.08/src/seqlist.h +--- RECON1.05/src/seqlist.h 2002-01-10 15:19:10.000000000 -0600 ++++ RECON-1.08/src/seqlist.h 2014-02-05 16:05:18.000000000 -0600 +@@ -1,5 +1,6 @@ + + #include "bolts.h" ++#include "string.h" + + #ifndef _seqlist_h + #define _seqlist_h