Mercurial > repos > rliterman > csp2
diff CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/clump/ReadKey.java @ 68:5028fdace37b
planemo upload commit 2e9511a184a1ca667c7be0c6321a36dc4e3d116d
author | jpayne |
---|---|
date | Tue, 18 Mar 2025 16:23:26 -0400 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/CSP2/CSP2_env/env-d9b9114564458d9d-741b3de822f2aaca6c6caa4325c4afce/opt/bbmap-39.01-1/current/clump/ReadKey.java Tue Mar 18 16:23:26 2025 -0400 @@ -0,0 +1,238 @@ +package clump; + +import java.io.Serializable; + +import hiseq.FlowcellCoordinate; +import shared.KillSwitch; +import shared.Tools; +import stream.Read; +import structures.IntList; + +class ReadKey implements Serializable, Comparable<ReadKey> { + +// public static ReadKey makeKeyIfNeeded(Read r){ +// if(r.obj==null){ +// return makeKey(r, true); +// } +// return (ReadKey)r.obj; +// } + + public static ReadKey makeKey(Read r, boolean setObject){ + assert(r.obj==null); + try { + ReadKey rk=new ReadKey(r); + if(setObject){r.obj=rk;} + return rk; + } catch (OutOfMemoryError e) { + KillSwitch.memKill(e); + throw new RuntimeException(e); + } + } + + private ReadKey(Read r){ + this(r, 0, 0, true); + } + + private ReadKey(Read r, long kmer_, int position_, boolean plus_){ + kmer=kmer_; + position=position_; + clump=null; + assert(!r.swapped()); + flipped=false; + kmerMinusStrand=!plus_; + + if(Clump.opticalOnly){ + FlowcellCoordinate fc=FlowcellCoordinate.getFC(); + fc.setFrom(r.id); + lane=fc.lane; + tile=fc.tile; + x=fc.x; + y=fc.y; + } +// expectedErrors=r.expectedErrorsIncludingMate(true); + } + + protected ReadKey(){} + + public void set(long kmer_, int position_, boolean minus_){ + setKmer(kmer_); + setPosition(position_); +// setClump(null); + kmerMinusStrand=minus_; + } + + private long setKmer(long kmer_){ + return kmer=kmer_; + } + + private int setPosition(int position_){ + return position=position_; + } + + public Clump setClump(Clump clump_){ + return clump=clump_; + } + + private boolean setFlipped(boolean flipped_){ + assert(flipped!=flipped_); + return flipped=flipped_; + } + + public void clear(){ + setKmer(0); + setPosition(0); + setClump(null); + kmerMinusStrand=false; + } + + public void flip(Read r, int k){ + assert(r.swapped()==flipped); + r.reverseComplement(); + r.setSwapped(!r.swapped()); + setFlipped(!flipped); + if(r.length()>=k){setPosition(r.length()-position+k-2);} + assert(r.swapped()==flipped); + } + + @Override + public int compareTo(ReadKey b){ + if(kmer!=b.kmer){return kmer>b.kmer ? -1 : 1;} //Bigger kmers first... + if(kmerMinusStrand!=b.kmerMinusStrand){return kmerMinusStrand ? 1 : -1;} + if(position!=b.position){return position<b.position ? 1 : -1;} + if(Clump.opticalOnly){ + if(lane!=b.lane){return lane-b.lane;} + if(!spanTiles()){ + if(tile!=b.tile){return tile-b.tile;} + } + if(Clump.sortYEarly()){ //Improves speed slightly + if(y!=b.y){return y-b.y;} + } + } +// if(expectedErrors!=b.expectedErrors){ +// return expectedErrors>b.expectedErrors ? 1 : -1;//Higher quality first +// } + return 0; + } + + @Override + public boolean equals(Object b){ + return equals((ReadKey)b, false); + } + + @Override + public int hashCode() { + int x=(int)((kmer^position)&0xFFFFFFFFL); + return kmerMinusStrand ? -x : x; + } + + /** True if this physically contains b (ignoring mismatches) */ + public boolean physicallyContains(ReadKey b, int aLen, int bLen){ + if(bLen>aLen){return false;} + if(kmer!=b.kmer){return false;} + final int dif=position-b.position; + int bStart=dif, bStop=dif+bLen; + return bStart>=0 && bStop<=aLen; + } + + /** True if this physically contains b as a prefix or suffix (ignoring mismatches). + * More restrictive than physicallyContains. */ + public boolean physicalAffix(ReadKey b, int aLen, int bLen){ + if(bLen>aLen){return false;} + if(kmer!=b.kmer){return false;} + final int dif=position-b.position; + int bStart=dif, bStop=dif+bLen; + return (bStart==0 || bStop==aLen) && bStart>=0 && bStop<=aLen; + } + + /** Note that this is different than compareTo()==0 + * That's to prevent sortYEarly comparison making things unequal. + * @param b + * @return True if equal + */ + public boolean equals(ReadKey b, boolean containment){ + if(b==null){return false;} + if(kmer!=b.kmer){return false;} + if(!containment && (kmerMinusStrand!=b.kmerMinusStrand || position!=b.position)){return false;} + if(Clump.opticalOnly){ + if(lane!=b.lane){return false;} + if(!spanTiles()){ + if(tile!=b.tile){return false;} + } + } + return true; + } + public boolean equals(ReadKey b){ + return equals(b, false); + } + + @Override + public String toString(){ + return position+","+(kmerMinusStrand ? ",t" : ",f")+","+kmer+"\t"+lane+","+tile+","+x+","+y; + } + + public float distance(ReadKey rkb){ + if(lane!=rkb.lane){return FlowcellCoordinate.big;} + + long a=Tools.absdif(x, rkb.x), b=Tools.absdif(y, rkb.y); + if(tile!=rkb.tile){ + if(spanTiles()){ + if(spanAdjacentOnly && Tools.absdif(tile, rkb.tile)>1){return FlowcellCoordinate.big;} + if(spanTilesX && spanTilesY){ + return Tools.min(a, b); + }else if(spanTilesX){ + return a; + }else{ + return b; + } + }else{ + return FlowcellCoordinate.big; + } + } + return (float)Math.sqrt(a*a+b*b); + } + + public boolean near(ReadKey rkb, float dist){ + return distance(rkb)<dist; + } + + public boolean nearXY(ReadKey rkb, float dist){ + if(lane!=rkb.lane){return false;} + + long a=Tools.absdif(x, rkb.x), b=Tools.absdif(y, rkb.y); + return Tools.min(a,b)<=dist; + } + + public int flag; + + public long kmer; + /** Position of rightmost base of kmer */ + public int position; + public boolean flipped; + public boolean kmerMinusStrand; + public Clump clump; + public IntList vars; +// public float expectedErrors; + + public int lane, tile, x, y; + + public static final int overhead=overhead(); + private static int overhead(){ + return 16+ //self + 1*(8)+ //kmer + 1*(4)+ //int fields + 2*(4)+ //booleans + 2*(8)+ //pointers + 4*(4); //flowcell coordinate + } + + public static boolean spanTiles(){return spanTilesX || spanTilesY;} + public static boolean spanTilesX=false; + public static boolean spanTilesY=false; + public static boolean spanAdjacentOnly=false; + + /** + * + */ + private static final long serialVersionUID = 1L; + +}