bio-velvet_underground 0.0.1 → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: fb4a2dda523583497755b908d85e6b5688562582
4
- data.tar.gz: 24da3eeb3f3f25818527db4ed3b2278d6c8e9bd8
3
+ metadata.gz: 4af6bceb99a775604acc0b87e641f42834bfe86f
4
+ data.tar.gz: bc8d0a17768ec2f94fd304c98a58505229b2a955
5
5
  SHA512:
6
- metadata.gz: 306e0ee16f7bef2742c1b6717d342a84e8d603240c0b217c7fde8703be30e86526ded8e4d48e0284415eebea15b5500f90351ea0e7125f201aa8567b4300feee
7
- data.tar.gz: 5333a971fd4b52803aabb3fefd49658807cd790858a524f245d87d51897274853d3880c1aa33597ee6c975bcf1755a23f457667d0a963c68a725e840dfe0e747
6
+ metadata.gz: f652e8333d0e2fa600bab4a9f3c9a0dc5bb4670b0a9caef3cbbf2999f3435068e22bd65b41c43671910a6eaf808af70a2afa5e4787aa1d90cda347c96ec3a510
7
+ data.tar.gz: d00da35ed8e0926392a60ce93251d293ccb032803fb3e0b0ec81a9477ff7d6f96a452a75caa36e36a97d765e7aff33821bc73a354c2b74c6c73fae9c87001f3d
@@ -1,3 +1,4 @@
1
1
  [submodule "ext/src"]
2
2
  path = ext/src
3
+ branch = underground
3
4
  url = https://github.com/wwood/velvet
data/.rspec ADDED
@@ -0,0 +1 @@
1
+ --color
data/Gemfile CHANGED
@@ -4,6 +4,7 @@ source "http://rubygems.org"
4
4
  # gem "activesupport", ">= 2.3.5"
5
5
 
6
6
  gem 'ffi', '~> 1.9'
7
+ gem 'bio-logger', '~> 1.0'
7
8
 
8
9
  # Add dependencies to develop your gem here.
9
10
  # Include everything needed to run rake, tests, features, etc.
data/README.md CHANGED
@@ -2,34 +2,78 @@
2
2
 
3
3
  [![Build Status](https://secure.travis-ci.org/wwood/bioruby-velvet_underground.png)](http://travis-ci.org/wwood/bioruby-velvet_underground)
4
4
 
5
- This biogem is aimed at providing Ruby bindings to the velvet assembler's source code.
6
-
7
- Note: this software is under active development!
5
+ This biogem is aimed at providing Ruby bindings to the velvet assembler's source code. See also [bio-velvet](https://github.com/wwood/bioruby-velvet) for Ruby code that does not bind the velvet C.
8
6
 
9
7
  ## Installation
10
8
 
11
9
  ```sh
12
10
  gem install bio-velvet_underground
13
11
  ```
12
+ This can take a few minutes as several versions of velvet with different kmer sizes are compiled.
14
13
 
15
14
  ## Usage
16
15
 
17
- The only thing implemented at this stage is access to the binary sequence file created when velveth is run with the `-create_binary` flag.
16
+ The code is intended to cater for a few specific purposes.
18
17
 
18
+ ### Running velvet
19
+ Running velvet returns a `Result` object, which is effectively a pointer to a velvet result directory
19
20
  ```ruby
20
21
  require 'bio-velvet_underground'
21
22
 
23
+ #kmer 29, '-short my.fasta' the argument to velveth, no special arguments given to velvetg.
24
+ result = Bio::Velvet::Runner.new.velvet(29,"-short my.fasta",'')
25
+ result.result_directory #=> path to temporary directory, containing velvet generated files e.g. contigs.fna
26
+
27
+ # A pre-defined velvet result directory:
28
+ result = Bio::Velvet::Runner.new.velvet(29,"-short my.fasta",'',:output_assembly_path => '/path/to/result')
29
+ result.result_directory #=> '/path/to/result'
30
+ ```
31
+ With the magic of Ruby-FFI, the library with the smallest kmer size >= 29 is chosen (in this case 31).
32
+ Several libraries are pre-compiled at gem install-time, and then bound at runtime. `velveth` and `velvetg`
33
+ steps can be run separetely if required.
34
+
35
+ ### Working with the binary sequence file
36
+ The binary sequence file created when velveth is run with the `-create_binary` flag.
37
+
38
+ ```ruby
22
39
  seqs = Bio::Velvet::Underground::BinarySequenceStore.new '/path/to/velvet/directory/CnyUnifiedSeq'
23
- seqs[1] #=> 'CACTTATCTCTACCAAAGATCACGATTTAGAATCAAACTATAAAGTTTTAGAAGATAAAGTAACAACTTATACATGGGGA'
24
40
  seqs.length #=> 77 (there is 77 sequences in the CnyUnifiedSeq)
41
+ seqs[1] #=> 'CACTTATCTCTACCAAAGATCACGATTTAGAATCAAACTATAAAGTTTTAGAAGATAAAGTAACAACTTATACATGGGGA'
42
+ seqs[0] #=> nil (indices map directly to the indices in other velvet files)
43
+ ```
25
44
 
45
+ ### Working with LastGraph file
46
+ ```ruby
47
+ path = 'spec/data/3/Assem/LastGraph'
48
+ graph = Bio::Velvet::Underground::Graph.parse_from_file path #=> Bio::Velvet::Underground::Graph object
49
+
50
+ graph.hash_length #=> 31 (kmer length)
51
+ graph.node_count #=> 4
52
+
53
+ graph.nodes[1] #=> Bio::Velvet::Underground::Graph::Node object
54
+ graph.nodes[2].ends_of_kmers_of_node #=> 'GTTTAAAAGAAGGAGATTACTTTATAAAA'
55
+ graph.nodes[2].coverages #=> [58,0] (coverages from different categories)
56
+
57
+ graph.nodes[1].short_reads #=> Array of Bio::Velvet::Underground::Graph::NodedRead objects
58
+ graph.nodes[1].short_reads[0].direction #=> true (i.e. forward w.r.t the node)
59
+ graph.nodes[1].short_reads[2].read_id #=> 4
26
60
  ```
61
+ There are more to these objects - see the documention.
62
+
63
+
64
+ Patches to these and other parts of velvet welcome.
65
+
66
+ ## Development practice
67
+
68
+ The velvet C code 'underground' here is for the most part vanilla velvet code as you might expect.
69
+ However some changes were necessary to allow binding from this biogem. For instance the library
70
+ does not write to `$stdout` as this interferes with Ruby's writes to `$stdout`.
27
71
 
28
- Patches to other parts of velvet welcome.
72
+ There are also some extra options for controlling velvet's behaviour, geared towards taking
73
+ some of the guesswork out of the assembly process at the expense of a less resolved `LastGraph`.
74
+ These are currently non-standard modifications - get in touch with @wwood if you are interested.
75
+ Not invoking these options should leave 'normal' velvet behaviour intact.
29
76
 
30
- The API doc is online. For more code examples see the test files in
31
- the source tree.
32
-
33
77
  ## Project home page
34
78
 
35
79
  Information on the source tree, documentation, examples, issues and
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.0.1
1
+ 0.1.0
@@ -22,15 +22,33 @@ require 'rake/clean'
22
22
  path = File.expand_path(File.dirname(__FILE__))
23
23
  path_external = File.join(File.dirname(__FILE__), "../lib/bio-velvet_underground/external")
24
24
 
25
+ # Require constants - code shared between before and after installation
26
+ require File.join(File.dirname(__FILE__), "../lib/bio-velvet_underground/constants")
27
+
25
28
  task :compile do
26
29
  cd(File.join(File.dirname(__FILE__),'src')) do
27
- sh "patch -p1 < ../bioruby.patch"
28
30
  case Config::CONFIG['host_os']
29
31
  when /linux/
30
- sh "make shared"
31
- cp("obj/shared/libvelvet.so.1.0",path_external)
32
+
33
+ # Create library with default install params
34
+ $stdout.puts "Making velvet shared library with default parameters"
35
+ sh "make shared"
36
+ shared_location = 'obj/shared'
37
+ cp(File.join(shared_location,"libvelvet.so.1.0"), path_external)
38
+ $stdout.puts "Finished installing default library version"
39
+ # Create libraries with larger non-default kmer sizes
40
+ Bio::Velvet::Underground.max_kmers.each do |max_kmer|
41
+ next if max_kmer == Bio::Velvet::Underground::DEFAULT_MAXKMERLENGTH
42
+
43
+ $stdout.puts "Making velvet shared library with kmer "+max_kmer.to_s
44
+ library_name = File.basename Bio::Velvet::Underground.library_location_of(max_kmer)
45
+ sh "make clean; make MAXKMERLENGTH="+max_kmer.to_s+" shared"
46
+ cp(File.join(shared_location,"libvelvet.so.1.0"),
47
+ File.join(path_external,File.basename(library_name)))
48
+ end
49
+
32
50
  when /darwin/
33
- raise NotImplementedError, "possibly will work, but bio-velvet_underground is not tested on OSX"
51
+ raise NotImplementedError, "possibly will work, but bio-velvet_underground is not tested on OSX"
34
52
  when /mswin|mingw/ then raise NotImplementedError, "bio-velvet_underground library is not available for Windows platform"
35
53
  end #case
36
54
  end #cd
@@ -20,14 +20,14 @@ endif
20
20
 
21
21
  ifdef VBIGASSEMBLY
22
22
  override DEF := $(DEF) -D BIGASSEMBLY -D VBIGASSEMBLY
23
- endif
23
+ endif
24
24
 
25
25
 
26
26
  ifdef LONGSEQUENCES
27
27
  override DEF := $(DEF) -D LONGSEQUENCES
28
28
  endif
29
29
 
30
- # OpenMP
30
+ # OpenMP
31
31
  ifdef OPENMP
32
32
  override CFLAGS := $(CFLAGS) -fopenmp
33
33
  endif
@@ -39,23 +39,24 @@ endif
39
39
 
40
40
  OBJ = obj/tightString.o obj/run.o obj/splay.o obj/splayTable.o obj/graph.o obj/run2.o obj/fibHeap.o obj/fib.o obj/concatenatedGraph.o obj/passageMarker.o obj/graphStats.o obj/correctedGraph.o obj/dfib.o obj/dfibHeap.o obj/recycleBin.o obj/readSet.o obj/binarySequences.o obj/shortReadPairs.o obj/locallyCorrectedGraph.o obj/graphReConstruction.o obj/roadMap.o obj/preGraph.o obj/preGraphConstruction.o obj/concatenatedPreGraph.o obj/readCoherentGraph.o obj/utility.o obj/kmer.o obj/scaffold.o obj/kmerOccurenceTable.o obj/allocArray.o obj/autoOpen.o
41
41
  OBJDBG = $(subst obj,obj/dbg,$(OBJ))
42
+ OBJSHARED = $(subst obj,obj/shared,$(OBJ))
42
43
 
43
- default : cleanobj zlib obj velveth velvetg doc
44
+ default : zlib obj velveth velvetg
44
45
 
45
46
  clean : clean-zlib
46
- -rm obj/*.o obj/dbg/*.o ./velvet*
47
+ -rm obj/*.o obj/dbg/*.o obj/shared/*.o obj/shared/velvet.so.0.0.1 ./velvet*
47
48
  -rm -f doc/manual_src/Manual.toc doc/manual_src/Manual.aux doc/manual_src/Manual.out doc/manual_src/Manual.log
48
49
  -rm -f doc/manual_src/Columbus_manual.aux doc/manual_src/Columbus_manual.out doc/manual_src/Columbus_manual.log
49
50
 
50
- cleanobj:
51
- -rm obj/*.o obj/dbg/*.o
51
+ cleanobj:
52
+ -rm obj/*.o obj/dbg/*.o obj/shared/*.o
52
53
 
53
54
  ifdef BUNDLEDZLIB
54
55
  Z_LIB_DIR=third-party/zlib-1.2.3
55
56
  Z_LIB_FILES=$(Z_LIB_DIR)/*.o
56
57
  override DEF := $(DEF) -D BUNDLEDZLIB
57
58
 
58
- zlib:
59
+ zlib:
59
60
  cd $(Z_LIB_DIR); ./configure; make; rm minigzip.o; rm example.o
60
61
 
61
62
  clean-zlib :
@@ -67,14 +68,14 @@ zlib :
67
68
  clean-zlib :
68
69
  endif
69
70
 
70
- velveth : obj
71
+ velveth : obj
71
72
  $(CC) $(CFLAGS) $(OPT) $(LDFLAGS) -o velveth obj/tightString.o obj/run.o obj/recycleBin.o obj/splay.o obj/splayTable.o obj/readSet.o obj/binarySequences.o obj/utility.o obj/kmer.o obj/kmerOccurenceTable.o obj/autoOpen.o $(Z_LIB_FILES) $(LIBS)
72
73
 
73
74
 
74
75
  velvetg : obj
75
76
  $(CC) $(CFLAGS) $(OPT) $(LDFLAGS) -o velvetg obj/tightString.o obj/graph.o obj/run2.o obj/fibHeap.o obj/fib.o obj/concatenatedGraph.o obj/passageMarker.o obj/graphStats.o obj/correctedGraph.o obj/dfib.o obj/dfibHeap.o obj/recycleBin.o obj/readSet.o obj/binarySequences.o obj/shortReadPairs.o obj/scaffold.o obj/locallyCorrectedGraph.o obj/graphReConstruction.o obj/roadMap.o obj/preGraph.o obj/preGraphConstruction.o obj/concatenatedPreGraph.o obj/readCoherentGraph.o obj/utility.o obj/kmer.o obj/kmerOccurenceTable.o obj/allocArray.o obj/autoOpen.o $(Z_LIB_FILES) $(LIBS)
76
77
 
77
- debug : override DEF := $(DEF) -D DEBUG
78
+ debug : override DEF := $(DEF) -D DEBUG
78
79
  debug : cleanobj obj/dbg
79
80
  $(CC) $(CFLAGS) $(LDFLAGS) $(DEBUG) -o velveth obj/dbg/tightString.o obj/dbg/run.o obj/dbg/recycleBin.o obj/dbg/splay.o obj/dbg/splayTable.o obj/dbg/readSet.o obj/dbg/binarySequences.o obj/dbg/utility.o obj/dbg/kmer.o obj/dbg/kmerOccurenceTable.o obj/dbg/allocArray.o obj/dbg/autoOpen.o $(Z_LIB_FILES) $(LIBS)
80
81
  $(CC) $(CFLAGS) $(LDFLAGS) $(DEBUG) -o velvetg obj/dbg/tightString.o obj/dbg/graph.o obj/dbg/run2.o obj/dbg/fibHeap.o obj/dbg/fib.o obj/dbg/concatenatedGraph.o obj/dbg/passageMarker.o obj/dbg/graphStats.o obj/dbg/correctedGraph.o obj/dbg/dfib.o obj/dbg/dfibHeap.o obj/dbg/recycleBin.o obj/dbg/readSet.o obj/dbg/binarySequences.o obj/dbg/shortReadPairs.o obj/dbg/scaffold.o obj/dbg/locallyCorrectedGraph.o obj/dbg/graphReConstruction.o obj/dbg/roadMap.o obj/dbg/preGraph.o obj/dbg/preGraphConstruction.o obj/dbg/concatenatedPreGraph.o obj/dbg/readCoherentGraph.o obj/dbg/utility.o obj/dbg/kmer.o obj/dbg/kmerOccurenceTable.o obj/dbg/allocArray.o obj/dbg/autoOpen.o $(Z_LIB_FILES) $(LIBS)
@@ -92,25 +93,25 @@ colordebug : cleanobj obj/dbg_de
92
93
  objdir:
93
94
  mkdir -p obj
94
95
 
95
- obj: zlib cleanobj objdir $(OBJ)
96
+ obj: zlib objdir $(OBJ)
96
97
 
97
98
  obj_de: override DEF := $(DEF) -D COLOR
98
99
  obj_de: zlib cleanobj objdir $(OBJ)
99
100
 
100
- obj/dbgdir:
101
+ obj/dbgdir:
101
102
  mkdir -p obj/dbg
102
103
 
103
- obj/dbg: override DEF := $(DEF) -D DEBUG
104
+ obj/dbg: override DEF := $(DEF) -D DEBUG
104
105
  obj/dbg: zlib cleanobj obj/dbgdir $(OBJDBG)
105
106
 
106
107
  obj/dbg_de: override DEF := $(DEF) -D COLOR -D DEBUG
107
108
  obj/dbg_de: zlib cleanobj obj/dbgdir $(OBJDBG)
108
109
 
109
110
  obj/%.o: src/%.c
110
- $(CC) $(CFLAGS) $(OPT) $(DEF) -c $? -o $@
111
+ $(CC) $(CFLAGS) $(OPT) $(DEF) -c $? -o $@
111
112
 
112
113
  obj/dbg/%.o: src/%.c
113
- $(CC) $(CFLAGS) $(DEBUG) $(DEF) -c $? -o $@
114
+ $(CC) $(CFLAGS) $(DEBUG) $(DEF) -c $? -o $@
114
115
 
115
116
  doc: Manual.pdf
116
117
 
@@ -123,3 +124,15 @@ endif
123
124
 
124
125
  test: velvetg velveth
125
126
  cd tests && ./run-tests.sh
127
+
128
+ sharedobjdir:
129
+ mkdir -p obj/shared
130
+
131
+ obj/shared: sharedobjdir $(OBJSHARED)
132
+
133
+ obj/shared/%.o: src/%.c
134
+ $(CC) -fPIC $(CFLAGS) $(DEBUG) $(DEF) -c $? -o $@
135
+
136
+ shared: zlib obj/shared
137
+ cd obj/shared && gcc -shared -Wl,-soname,libvelvet.so.1 -o libvelvet.so.1.0 allocArray.o autoOpen.o binarySequences.o concatenatedGraph.o concatenatedPreGraph.o correctedGraph.o dfibHeap.o dfib.o fibHeap.o fib.o graph.o graphReConstruction.o graphStats.o kmer.o kmerOccurenceTable.o locallyCorrectedGraph.o passageMarker.o preGraphConstruction.o preGraph.o readCoherentGraph.o readSet.o recycleBin.o roadMap.o scaffold.o shortReadPairs.o splay.o splayTable.o tightString.o utility.o run.o run2.o
138
+
@@ -47,7 +47,7 @@ static void concatenatePreNodes(IDnum preNodeAID, PreArcI oldPreArc,
47
47
  hasSinglePreArc_pg(getOtherEnd_pg
48
48
  (preArc, preNodeBID),
49
49
  preGraph)
50
- && !isLoop_pg(preArc)
50
+ && !isLoop_pg(preArc)
51
51
  && getDestination_pg(preArc, preNodeBID) != preNodeAID) {
52
52
 
53
53
  totalLength += getPreNodeLength_pg(preNodeBID, preGraph);
@@ -99,11 +99,11 @@ static void concatenatePreNodes(IDnum preNodeAID, PreArcI oldPreArc,
99
99
  appendDescriptors_pg(&ptr, &writeOffset ,currentPreNodeID, preGraph, false);
100
100
  }
101
101
 
102
- if (writeOffset != 0)
102
+ if (writeOffset != 0)
103
103
  while (writeOffset++ != 4)
104
104
  (*ptr) >>= 2;
105
105
 
106
- setPreNodeDescriptor_pg(descr, totalLength - wordLength + 1, preNodeAID, preGraph);
106
+ setPreNodeDescriptor_pg(descr, totalLength - wordLength + 1, preNodeAID, preGraph);
107
107
 
108
108
  // Correct preArcs
109
109
  for (preArc = getPreArc_pg(preNodeBID, preGraph); preArc != NULL_IDX;
@@ -209,7 +209,7 @@ static boolean isEligibleTip(IDnum index, PreGraph * preGraph, Coordinate
209
209
  if (currentIndex == 0)
210
210
  return true;
211
211
 
212
- // Joined tips
212
+ // Joined tips
213
213
  if (simplePreArcCount_pg(-currentIndex, preGraph) < 2)
214
214
  return false;
215
215
 
@@ -764,7 +764,7 @@ static void remapNodeMarkersOntoNeighbour(Node * source,
764
764
  }
765
765
  }
766
766
 
767
- // Short read markers
767
+ // Short read markers
768
768
  if (readStartsAreActivated(graph)) {
769
769
  // Update Coordinates
770
770
  sourceArray = getNodeReads(source, graph);
@@ -1250,7 +1250,7 @@ static void foldSymmetricalNode(Node * node)
1250
1250
  twinNode = node;
1251
1251
  node = tmp;
1252
1252
  }
1253
- // Destroy link to old markers
1253
+ // Destroy link to old markers
1254
1254
  setMarker(node, NULL_IDX);
1255
1255
 
1256
1256
  // Reinsert markers properly
@@ -1951,7 +1951,7 @@ static void transferNodeData(Node * source, Node * target)
1951
1951
  if (getNode(fastPath) == twinSource)
1952
1952
  fastPath = getNextInSequence(fastPath);
1953
1953
 
1954
- // Next node
1954
+ // Next node
1955
1955
  if (source == activeNode) {
1956
1956
  activeNode = target;
1957
1957
  todo =
@@ -2013,7 +2013,7 @@ static void concatenateNodesAndVaccinate(Node * nodeA, Node * nodeB,
2013
2013
  // Read starts
2014
2014
  concatenateReadStarts(nodeA, nodeB, graph);
2015
2015
 
2016
- // Descriptor management
2016
+ // Descriptor management
2017
2017
  appendDescriptors(nodeA, nodeB);
2018
2018
 
2019
2019
  // Update uniqueness:
@@ -2094,9 +2094,11 @@ static void cleanUpRedundancy()
2094
2094
  if (isTerminal(slowMarker))
2095
2095
  slowLength = finalLength;
2096
2096
  else {
2097
- slowLength =
2098
- slowToFastMapping[getPassageMarkerFinish
2099
- (slowMarker) - 1];
2097
+ if(getPassageMarkerFinish(slowMarker) != 0)
2098
+ slowLength = slowToFastMapping[getPassageMarkerFinish(slowMarker) - 1];
2099
+ else
2100
+ slowLength = slowToFastMapping[0];
2101
+
2100
2102
  if (slowLength < slowConstraint)
2101
2103
  slowLength = slowConstraint;
2102
2104
  }
@@ -2165,7 +2167,7 @@ static void cleanUpRedundancy()
2165
2167
 
2166
2168
  //velvetLog("Concatenation\n");
2167
2169
 
2168
- // Freeing up memory
2170
+ // Freeing up memory
2169
2171
  if (slowMarker != NULL_IDX)
2170
2172
  concatenatePathNodes(slowPath);
2171
2173
  else
@@ -2458,7 +2460,7 @@ void clipTipsHard(Graph * graph, boolean conserveLong)
2458
2460
 
2459
2461
  if (current == NULL)
2460
2462
  continue;
2461
-
2463
+
2462
2464
  if (conserveLong && getMarker(current))
2463
2465
  continue;
2464
2466
 
@@ -2558,7 +2560,7 @@ void correctGraph(Graph * argGraph, ShortLength * argSequenceLengths, Category *
2558
2560
  eligibleStartingPoints = mallocOrExit(2 * nodes + 1, IDnum);
2559
2561
  progressStatus = callocOrExit(2 * nodes + 1, boolean);
2560
2562
  todoLists = callocOrExit(2 * nodes + 1, Ticket *);
2561
- //Done with memory
2563
+ //Done with memory
2562
2564
 
2563
2565
  resetNodeStatus(graph);
2564
2566
  determineEligibleStartingPoints();
@@ -2605,9 +2607,9 @@ void setMaxReadLength(int value)
2605
2607
  if (value < 0) {
2606
2608
  velvetLog("Negative branch length %i!\n", value);
2607
2609
  velvetLog("Exiting...\n");
2608
- #ifdef DEBUG
2610
+ #ifdef DEBUG
2609
2611
  abort();
2610
- #endif
2612
+ #endif
2611
2613
  exit(1);
2612
2614
  }
2613
2615
  MAXREADLENGTH = value;
@@ -2619,9 +2621,9 @@ void setMaxGaps(int value)
2619
2621
  if (value < 0) {
2620
2622
  velvetLog("Negative max gap count %i!\n", value);
2621
2623
  velvetLog("Exiting...\n");
2622
- #ifdef DEBUG
2624
+ #ifdef DEBUG
2623
2625
  abort();
2624
- #endif
2626
+ #endif
2625
2627
  exit(1);
2626
2628
  }
2627
2629
  MAXGAPS = value;
@@ -2633,9 +2635,9 @@ void setMaxDivergence(double value)
2633
2635
  velvetLog("Divergence rate %lf out of bounds [0,1]!\n",
2634
2636
  value);
2635
2637
  velvetLog("Exiting...\n");
2636
- #ifdef DEBUG
2638
+ #ifdef DEBUG
2637
2639
  abort();
2638
- #endif
2640
+ #endif
2639
2641
  exit(1);
2640
2642
  }
2641
2643
  MAXDIVERGENCE = value;
@@ -906,7 +906,7 @@ void appendDescriptors(Node * destination, Node * source)
906
906
  twinDestination->length = newLength;
907
907
  }
908
908
 
909
- static void catDescriptors(Descriptor * descr, Coordinate destinationLength, Descriptor * copy, Coordinate sourceLength)
909
+ static void catDescriptors(Descriptor * descr, Coordinate destinationLength, Descriptor * copy, Coordinate sourceLength)
910
910
  {
911
911
  Coordinate index;
912
912
  Nucleotide nucleotide;
@@ -917,7 +917,7 @@ static void catDescriptors(Descriptor * descr, Coordinate destinationLength, Des
917
917
  }
918
918
  }
919
919
 
920
- static void reverseCatDescriptors(Descriptor * descr, Coordinate destinationLength, Descriptor * copy, Coordinate sourceLength, Coordinate totalLength)
920
+ static void reverseCatDescriptors(Descriptor * descr, Coordinate destinationLength, Descriptor * copy, Coordinate sourceLength, Coordinate totalLength)
921
921
  {
922
922
  Coordinate shift = totalLength - destinationLength - sourceLength;
923
923
  Coordinate index;
@@ -2052,7 +2052,7 @@ Graph *importGraph(char *filename)
2052
2052
  short short_var;
2053
2053
  char c;
2054
2054
 
2055
- if (file == NULL)
2055
+ if (file == NULL)
2056
2056
  exitErrorf(EXIT_FAILURE, true, "Could not open %s", filename);
2057
2057
 
2058
2058
  velvetLog("Reading graph file %s\n", filename);
@@ -2204,9 +2204,9 @@ Graph *importGraph(char *filename)
2204
2204
  velvetLog
2205
2205
  ("ERROR: reading in graph - only %d items read for line '%s'",
2206
2206
  sCount, line);
2207
- #ifdef DEBUG
2207
+ #ifdef DEBUG
2208
2208
  abort();
2209
- #endif
2209
+ #endif
2210
2210
  exit(1);
2211
2211
  }
2212
2212
  newMarker =
@@ -2404,7 +2404,7 @@ Graph *readPreGraphFile(char *preGraphFilename, boolean * double_strand)
2404
2404
  #endif
2405
2405
  }
2406
2406
  }
2407
-
2407
+
2408
2408
  index++;
2409
2409
  }
2410
2410
 
@@ -2506,7 +2506,7 @@ Graph *readConnectedGraphFile(char *connectedGraphFilename, boolean * double_str
2506
2506
  twin = node->twinNode;
2507
2507
  twin->length = node->length;
2508
2508
  twin->descriptor =
2509
- callocOrExit(arrayLength, Descriptor);
2509
+ callocOrExit(arrayLength, Descriptor);
2510
2510
 
2511
2511
  index = 0;
2512
2512
  while ((c = getc(file)) != '\n') {
@@ -3145,9 +3145,13 @@ ShortReadMarker *extractFrontOfNodeReads(Node * node,
3145
3145
  }
3146
3146
 
3147
3147
  free(sourceArray);
3148
- graph->nodeReads[sourceID] = newArray;
3149
3148
  graph->nodeReadCounts[sourceID] = newLength;
3150
3149
 
3150
+ if(newLength > 0)
3151
+ graph->nodeReads[sourceID] = newArray;
3152
+ else
3153
+ graph->nodeReads[sourceID] = NULL;
3154
+
3151
3155
  *length = mergeLength;
3152
3156
  return mergeArray;
3153
3157
  }
@@ -3275,9 +3279,13 @@ ShortReadMarker *extractBackOfNodeReads(Node * node, Coordinate breakpoint,
3275
3279
  }
3276
3280
 
3277
3281
  free(sourceArray);
3278
- graph->nodeReads[sourceID] = newArray;
3279
3282
  graph->nodeReadCounts[sourceID] = newLength;
3280
3283
 
3284
+ if(newLength > 0)
3285
+ graph->nodeReads[sourceID] = newArray;
3286
+ else
3287
+ graph->nodeReads[sourceID] = NULL;
3288
+
3281
3289
  *length = mergeLength;
3282
3290
  return mergeArray;
3283
3291
  }
@@ -3321,8 +3329,13 @@ void spreadReadIDs(ShortReadMarker * reads, IDnum readCount, Node * node,
3321
3329
  sourceIndex++;
3322
3330
  }
3323
3331
 
3324
- graph->nodeReads[targetID] = mergeArray;
3325
3332
  graph->nodeReadCounts[targetID] = sourceLength;
3333
+
3334
+ if(sourceLength > 0)
3335
+ graph->nodeReads[targetID] = mergeArray;
3336
+ else
3337
+ graph->nodeReads[targetID] = NULL;
3338
+
3326
3339
  return;
3327
3340
  }
3328
3341
 
@@ -3402,8 +3415,12 @@ void spreadReadIDs(ShortReadMarker * reads, IDnum readCount, Node * node,
3402
3415
  }
3403
3416
 
3404
3417
  free(targetArray);
3405
- graph->nodeReads[targetID] = mergeArray;
3406
3418
  graph->nodeReadCounts[targetID] = mergeLength;
3419
+
3420
+ if(mergeLength > 0)
3421
+ graph->nodeReads[targetID] = mergeArray;
3422
+ else
3423
+ graph->nodeReads[targetID] = NULL;
3407
3424
  }
3408
3425
 
3409
3426
  static inline Coordinate min(Coordinate A, Coordinate B)
@@ -3437,8 +3454,13 @@ void injectShortReads(ShortReadMarker * sourceArray, IDnum sourceLength,
3437
3454
 
3438
3455
  if (targetLength == 0) {
3439
3456
  free(targetArray);
3440
- graph->nodeReads[targetID] = sourceArray;
3441
3457
  graph->nodeReadCounts[targetID] = sourceLength;
3458
+
3459
+ if(sourceLength > 0)
3460
+ graph->nodeReads[targetID] = sourceArray;
3461
+ else
3462
+ graph->nodeReads[targetID] = NULL;
3463
+
3442
3464
  return;
3443
3465
  }
3444
3466
 
@@ -3548,9 +3570,13 @@ void injectShortReads(ShortReadMarker * sourceArray, IDnum sourceLength,
3548
3570
  }
3549
3571
 
3550
3572
  free(targetArray);
3551
- graph->nodeReads[targetID] = mergeArray;
3552
3573
  graph->nodeReadCounts[targetID] = mergeLength;
3553
3574
 
3575
+ if(mergeLength > 0)
3576
+ graph->nodeReads[targetID] = mergeArray;
3577
+ else
3578
+ graph->nodeReads[targetID] = NULL;
3579
+
3554
3580
  free(sourceArray);
3555
3581
  }
3556
3582
 
@@ -3693,12 +3719,20 @@ void foldSymmetricalNodeReads(Node * node, Graph * graph)
3693
3719
  }
3694
3720
 
3695
3721
  free(targetArray);
3696
- graph->nodeReads[targetID] = mergeArray;
3697
3722
  graph->nodeReadCounts[targetID] = mergeLength;
3698
3723
 
3724
+ if(mergeLength > 0)
3725
+ graph->nodeReads[targetID] = mergeArray;
3726
+ else
3727
+ graph->nodeReads[targetID] = NULL;
3728
+
3699
3729
  free(sourceArray);
3700
- graph->nodeReads[sourceID] = mergeArray2;
3701
3730
  graph->nodeReadCounts[sourceID] = mergeLength;
3731
+
3732
+ if(mergeLength > 0)
3733
+ graph->nodeReads[sourceID] = mergeArray2;
3734
+ else
3735
+ graph->nodeReads[sourceID] = NULL;
3702
3736
  }
3703
3737
 
3704
3738
  void shareReadStarts(Node * target, Node * source, Graph * graph)
@@ -3973,7 +4007,7 @@ void reallocateNodeDescriptor(Node * node, Coordinate length) {
3973
4007
  nucleotide = getNucleotideInDescriptor(twin->descriptor, index);
3974
4008
  writeNucleotideInDescriptor(nucleotide, array, index + shift);
3975
4009
  }
3976
-
4010
+
3977
4011
  free(twin->descriptor);
3978
4012
  twin->descriptor = array;
3979
4013
  }