1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
package clump;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import fileIO.FileFormat;
import fileIO.ReadWrite;
import sort.SortByName;
import stream.ConcurrentReadInputStream;
import stream.ConcurrentReadOutputStream;
import stream.Read;
import structures.ListNum;
public class StreamToOutput {
public StreamToOutput(FileFormat ffin1, FileFormat ffin2, ConcurrentReadOutputStream[] rosa_, KmerComparator old, boolean sortByName_, boolean incrementComparator){
final ConcurrentReadInputStream cris=ConcurrentReadInputStream.getReadInputStream(-1, false, ffin1, ffin2, null, null);
cris.start();
rosa=rosa_;
kc=(incrementComparator ? new KmerComparator(old.k, old.seed+1, old.border-1, old.hashes, false, false) : old);
sortByName=sortByName_;
}
public StreamToOutput(ConcurrentReadInputStream cris_, ConcurrentReadOutputStream[] rosa_, KmerComparator old, boolean sortByName_, boolean incrementComparator){
cris=cris_;
rosa=rosa_;
kc=(incrementComparator ? new KmerComparator(old.k, old.seed+1, old.border-1, old.hashes, false, false) : old);
sortByName=sortByName_;
}
public boolean process(){
if(rosa==null || rosa.length==0){return errorState;}
File temp=null;
if(sortByName){
try {
temp=File.createTempFile("temp_namesort_", ".fq.gz");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
SortByName sbn=new SortByName(new String[] {"out="+temp.getAbsolutePath()});
sbn.processInner(cris);
FileFormat ff=FileFormat.testInput(temp.getAbsolutePath(), null, false);
cris=ConcurrentReadInputStream.getReadInputStream(-1, false, ff, null, null, null);
}
if(rosa.length==1){
processSingle(cris);
}else{
processMulti(cris);
}
errorState|=ReadWrite.closeStream(cris);
if(temp!=null){
temp.delete();
}
return errorState;
}
public void processSingle(ConcurrentReadInputStream cris){
ListNum<Read> ln=cris.nextList();
ArrayList<Read> reads=(ln!=null ? ln.list : null);
while(ln!=null && reads!=null && reads.size()>0){//ln!=null prevents a compiler potential null access warning
if(rosa!=null){rosa[0].add(reads, ln.id);}
for(Read r : reads){
readsIn+=r.pairCount();
basesIn+=r.pairLength();
}
cris.returnList(ln);
ln=cris.nextList();
reads=(ln!=null ? ln.list : null);
}
if(ln!=null){
cris.returnList(ln.id, ln.list==null || ln.list.isEmpty());
}
}
public void processMulti(ConcurrentReadInputStream cris){
final int groups=rosa.length;
@SuppressWarnings("unchecked")
final ArrayList<Read>[] out=new ArrayList[groups];
for(int i=0; i<out.length; i++){
out[i]=new ArrayList<Read>();
}
ListNum<Read> ln=cris.nextList();
ArrayList<Read> reads=(ln!=null ? ln.list : null);
while(ln!=null && reads!=null && reads.size()>0){//ln!=null prevents a compiler potential null access warning
for(Read r : reads){
long kmer=kc.hash(r, null, 0, false);
int group=(int)(kmer%groups);
out[group].add(r);
readsIn+=r.pairCount();
basesIn+=r.pairLength();
}
for(int group=0; group<groups; group++){
rosa[group].add(out[group], ln.id);
out[group]=new ArrayList<Read>();
}
cris.returnList(ln);
ln=cris.nextList();
reads=(ln!=null ? ln.list : null);
}
if(ln!=null){
cris.returnList(ln.id, ln.list==null || ln.list.isEmpty());
}
}
long readsIn=0;
long basesIn=0;
// final FileFormat ffin1;
// final FileFormat ffin2;
ConcurrentReadInputStream cris;
ConcurrentReadOutputStream[] rosa;
final KmerComparator kc;
final boolean sortByName;
boolean errorState=false;
}
|