1 package align2; 2 3 import java.io.File; 4 import java.io.Serializable; 5 6 import fileIO.LoadThread; 7 import fileIO.ReadWrite; 8 import shared.KillSwitch; 9 10 /** 11 * @author Brian Bushnell 12 * @date Dec 23, 2012 13 * 14 */ 15 public class Block implements Serializable{ 16 17 /** 18 * 19 */ 20 private static final long serialVersionUID = -1638122096023589384L; 21 Block(int numSites_, int numStarts_)22 public Block(int numSites_, int numStarts_){ 23 numSites=numSites_; 24 numStarts=numStarts_; 25 sites=new int[numSites]; 26 starts=new int[numStarts+1]; 27 assert(Integer.bitCount(numStarts)==1 && Integer.bitCount(starts.length)==2) : numStarts; 28 } 29 Block(int[] sites_, int[] starts_)30 public Block(int[] sites_, int[] starts_){ 31 sites=sites_; 32 starts=starts_; 33 numSites=sites.length; 34 numStarts=starts.length-1; 35 assert(Integer.bitCount(numStarts)==1 && Integer.bitCount(starts.length)==2) : numStarts; 36 } 37 38 /** For legacy support */ getHitList(int key)39 public int[] getHitList(int key){ 40 int len=length(key); 41 if(len==0){return null;} 42 int start=starts[key]; 43 int[] r=KillSwitch.copyOfRange(sites, start, start+len); 44 return r; 45 } 46 47 /** For legacy support */ getHitList(int start, int stop)48 public int[] getHitList(int start, int stop){ 49 int len=length(start, stop); 50 if(len==0){return null;} 51 assert(len>0) : len+", "+start+", "+stop; 52 int[] r=KillSwitch.copyOfRange(sites, start, start+len); 53 return r; 54 } 55 56 /** For legacy support */ getHitLists(int[] start, int[] stop)57 public int[][] getHitLists(int[] start, int[] stop){ 58 int[][] r=new int[start.length][]; 59 for(int i=0; i<start.length; i++){r[i]=getHitList(start[i], stop[i]);} 60 return r; 61 } 62 length(int key)63 public int length(int key){ 64 int x=starts[key+1]-starts[key]; 65 if(x==0){return 0;} 66 return sites[starts[key]]!=-1 ? x : 0; //Lists can be removed by making the first site -1. 67 } 68 length(int start, int stop)69 public int length(int start, int stop){ 70 if(start==stop || sites[start]==-1){return 0;} 71 return stop-start; 72 } 73 write(String fname, boolean overwrite)74 public boolean write(String fname, boolean overwrite){ 75 String fname2=fname+"2.gz"; 76 { 77 File f=new File(fname); 78 if(f.exists()){ 79 if(!overwrite){ 80 assert(false) : "Tried to overwrite file "+f.getAbsolutePath(); 81 return false; 82 } 83 } 84 f=new File(fname2); 85 if(f.exists()){ 86 if(!overwrite){ 87 assert(false) : "Tried to overwrite file "+f.getAbsolutePath(); 88 return false; 89 } 90 } 91 } 92 ReadWrite.writeObjectInThread(sites, fname, allowSubprocess); 93 if(!compress){ 94 ReadWrite.writeObjectInThread(starts, fname+"2.gz", allowSubprocess); 95 }else{ 96 if(copyOnWrite){ 97 final int[] x; 98 x=new int[starts.length]; 99 for(int i=1; i<x.length; i++){ 100 x[i]=starts[i]-starts[i-1]; 101 } 102 ReadWrite.writeObjectInThread(starts, fname+"2.gz", allowSubprocess); 103 }else{ 104 compress(starts); 105 ReadWrite.writeAsync(starts, fname+"2.gz", allowSubprocess); 106 decompress(starts); 107 } 108 } 109 return true; 110 } 111 compress(int[] x)112 private static void compress(int[] x){ 113 for(int i=x.length-1; i>0; i--){ 114 x[i]=x[i]-x[i-1]; 115 } 116 } 117 decompress(int[] x)118 private static void decompress(int[] x){ 119 int sum=x[0]; 120 for(int i=1; i<x.length; i++){ 121 sum+=x[i]; 122 x[i]=sum; 123 } 124 } 125 read(String fname)126 public static Block read(String fname){ 127 String fname2=fname+"2.gz"; 128 129 final int[] a, b; 130 { 131 LoadThread<int[]> lta=LoadThread.load(fname, int[].class); 132 b=ReadWrite.read(int[].class, fname2, false); 133 lta.waitForThisToFinish(); 134 a=lta.output; 135 } 136 // { 137 // LoadThread<int[]> lta=LoadThread.load(fname, int[].class); 138 // LoadThread<int[]> ltb=LoadThread.load(fname2, int[].class); 139 // lta.waitForThisToFinish(); 140 // ltb.waitForThisToFinish(); 141 // a=lta.output; 142 // b=ltb.output; 143 // } 144 145 // int[] a=ReadWrite.read(int[].class, fname); 146 // int[] b=ReadWrite.read(int[].class, fname2); 147 148 assert(a!=null && b!=null) : a+", "+b; 149 if(compress){ 150 int sum=b[0]; 151 for(int i=1; i<b.length; i++){ 152 sum+=b[i]; 153 b[i]=sum; 154 } 155 } 156 Block r=new Block(a, b); 157 assert(r.sites==a); 158 assert(r.starts==b); 159 return r; 160 } 161 162 public final int numSites; 163 public final int numStarts; 164 public final int[] sites; 165 public final int[] starts; 166 167 private static boolean allowSubprocess=false; 168 private static final boolean compress=true; 169 private static final boolean copyOnWrite=false; 170 171 } 172