Mercurial > repos > greg > paired_end_cross_plot
comparison src/pairedendCrossPlot.java @ 0:8055f3f619a1 draft default tip
Uploaded
| author | greg |
|---|---|
| date | Thu, 10 Mar 2016 10:34:37 -0500 |
| parents | |
| children |
comparison
equal
deleted
inserted
replaced
| -1:000000000000 | 0:8055f3f619a1 |
|---|---|
| 1 package pairedendCrossPlot; | |
| 2 | |
| 3 import java.io.File; | |
| 4 import java.io.FileNotFoundException; | |
| 5 import java.io.PrintStream; | |
| 6 import java.sql.Timestamp; | |
| 7 import java.util.ArrayList; | |
| 8 import java.util.Date; | |
| 9 import java.util.Scanner; | |
| 10 | |
| 11 public class pairedendCrossPlot { | |
| 12 | |
| 13 private static File READ1 = null; | |
| 14 private static File READ2 = null; | |
| 15 private static File OUTPUT = null; | |
| 16 private static int WINDOW = 500; | |
| 17 | |
| 18 private static int[] BP = null; | |
| 19 private static int[] FOR = null; | |
| 20 private static int[] REV = null; | |
| 21 | |
| 22 private static ArrayList<String> chrName = null; | |
| 23 private static ArrayList<Integer> chrStart = null; | |
| 24 | |
| 25 private static int[] FHIST = null; | |
| 26 private static int[] RHIST = null; | |
| 27 | |
| 28 public static void main(String[] args) throws FileNotFoundException { | |
| 29 loadConfig(args); //Load configuration data | |
| 30 FHIST = new int[(WINDOW * 2) + 1]; //Initialize master histograms | |
| 31 RHIST = new int[(WINDOW * 2) + 1]; //Initialize master histograms | |
| 32 System.out.println("\n" + getTimeStamp()); | |
| 33 | |
| 34 //Pass through the Read2 file once in order to identify the start and stops of all chromosomes present in file | |
| 35 System.out.println("Indexing Read 2 File..."); | |
| 36 indexFile(READ2); | |
| 37 System.out.println("Indexing Complete\n" + getTimeStamp()); | |
| 38 | |
| 39 //Parse read 1 | |
| 40 System.out.println("\n" + getTimeStamp() + "\nParsing Read 1 File..."); | |
| 41 parseRead1(READ1); | |
| 42 System.out.println("\nRead 1 Parsed\n" + getTimeStamp()); | |
| 43 | |
| 44 //Output histogram | |
| 45 System.out.println("\nOutputing final histogram..."); | |
| 46 outputHist(OUTPUT); | |
| 47 System.out.println("Program Complete\n" + getTimeStamp()); | |
| 48 | |
| 49 } | |
| 50 | |
| 51 public static void outputHist(File out) throws FileNotFoundException { | |
| 52 PrintStream OUT = new PrintStream(out); | |
| 53 for(int x = WINDOW * -1; x <= WINDOW; x++) { | |
| 54 OUT.print("\t" + x); | |
| 55 } | |
| 56 OUT.print("\nForward_Tags"); | |
| 57 for(int x = 0; x < FHIST.length; x++) { | |
| 58 OUT.print("\t" + FHIST[x]); | |
| 59 } | |
| 60 OUT.print("\nReverse_Tags"); | |
| 61 for(int x = 0; x < RHIST.length; x++) { | |
| 62 OUT.print("\t" + RHIST[x]); | |
| 63 } | |
| 64 OUT.close(); | |
| 65 } | |
| 66 | |
| 67 public static void parseRead1(File input) throws FileNotFoundException { | |
| 68 Scanner scan = new Scanner(READ1); | |
| 69 String currentChrom = ""; | |
| 70 int currentIndex = 0; | |
| 71 while (scan.hasNextLine()) { | |
| 72 String temp = scan.nextLine(); | |
| 73 if(!temp.contains("index") && !temp.contains("#")) { | |
| 74 String[] array = temp.split("\t"); | |
| 75 int POS = Integer.parseInt(array[1]); | |
| 76 int F = Integer.parseInt(array[2]); | |
| 77 int R = Integer.parseInt(array[3]); | |
| 78 | |
| 79 //Check if newline's chrom is equal to current chrom in memory, reload new chrom if unequal | |
| 80 if(!currentChrom.equals(array[0])) { | |
| 81 BP = null; //reset BP immediately | |
| 82 int newIndex = chrName.indexOf(array[0]); | |
| 83 if(newIndex >= 0) { | |
| 84 System.out.println("\nLoading: " + chrName.get(newIndex)); | |
| 85 loadRead2(READ2, chrName.get(newIndex), chrStart.get(newIndex), chrStart.get(newIndex + 1)); | |
| 86 currentChrom = array[0]; | |
| 87 currentIndex = 0; | |
| 88 System.out.println("Loading Complete\n" + getTimeStamp()); | |
| 89 } | |
| 90 } | |
| 91 if(BP != null) { | |
| 92 //Update local indexes to only upload data from local tag region defined by window | |
| 93 while(POS - WINDOW > BP[currentIndex] && currentIndex < BP.length - 1) { currentIndex++; } //Find furthest upstream index in read2 | |
| 94 int currentStop = currentIndex; | |
| 95 while(POS + WINDOW > BP[currentStop] && currentStop < BP.length - 1) { currentStop++; } //Find furthest downstream index in read2 | |
| 96 | |
| 97 //Populate histogram based on read2 tags flanking current position | |
| 98 int[] temp_F = new int[(WINDOW * 2) + 1]; | |
| 99 int[] temp_R = new int[(WINDOW * 2) + 1]; | |
| 100 for(int x = currentIndex; x <= currentStop; x++) { | |
| 101 int index = BP[x] - POS + WINDOW; | |
| 102 if(index >= 0 && index < temp_F.length) { | |
| 103 temp_F[index] += FOR[x]; | |
| 104 temp_R[index] += REV[x]; | |
| 105 } | |
| 106 } | |
| 107 | |
| 108 //Populate master histogram based on score | |
| 109 for(int x = 0; x < temp_F.length; x++) { | |
| 110 FHIST[x] += (temp_F[x] * F); | |
| 111 RHIST[x] += (temp_R[x] * F); | |
| 112 } | |
| 113 //Reverse arrays | |
| 114 for(int x = 0; x < FHIST.length / 2; x++) { | |
| 115 int tempF = temp_F[x]; | |
| 116 int tempR = temp_R[x]; | |
| 117 temp_F[x] = temp_F[temp_F.length - x - 1]; | |
| 118 temp_F[temp_F.length - x - 1] = tempF; | |
| 119 temp_R[x] = temp_R[temp_R.length - x - 1]; | |
| 120 temp_R[temp_R.length - x - 1] = tempR; | |
| 121 } | |
| 122 for(int x = 0; x < FHIST.length; x++) { | |
| 123 FHIST[x] += (temp_R[x] * R); | |
| 124 RHIST[x] += (temp_F[x] * R); | |
| 125 } | |
| 126 } | |
| 127 } | |
| 128 } | |
| 129 scan.close(); | |
| 130 } | |
| 131 | |
| 132 private static void loadRead2(File input, String currentChrom, int lineStart, int lineStop) throws FileNotFoundException { | |
| 133 BP = new int[lineStop - lineStart - 1]; | |
| 134 FOR = new int[lineStop - lineStart - 1]; | |
| 135 REV = new int[lineStop - lineStart - 1]; | |
| 136 | |
| 137 int counter = 0; | |
| 138 Scanner scan = new Scanner(READ2); | |
| 139 while (scan.hasNextLine()) { | |
| 140 String temp = scan.nextLine(); | |
| 141 if(counter > lineStart) { | |
| 142 String[] array = temp.split("\t"); | |
| 143 if(array[0].equals(currentChrom)) { | |
| 144 BP[counter - lineStart - 1] = Integer.parseInt(array[1]); | |
| 145 FOR[counter - lineStart - 1] = Integer.parseInt(array[2]); | |
| 146 REV[counter - lineStart - 1] = Integer.parseInt(array[3]); | |
| 147 } | |
| 148 } | |
| 149 counter++; | |
| 150 } | |
| 151 scan.close(); | |
| 152 //System.out.println(BP.length + "\t" + FOR.length + "\t" + REV.length); | |
| 153 } | |
| 154 | |
| 155 //Index Read 2 file for faster processing of chromosomes | |
| 156 public static void indexFile(File input) throws FileNotFoundException { | |
| 157 chrName = new ArrayList<String>(); | |
| 158 chrStart = new ArrayList<Integer>(); | |
| 159 Scanner scan = new Scanner(input); | |
| 160 int linenumber = 0; | |
| 161 while (scan.hasNextLine()) { | |
| 162 String temp = scan.nextLine(); | |
| 163 if(!temp.contains("index") && !temp.contains("#")) { | |
| 164 String[] array = temp.split("\t"); | |
| 165 if(!chrName.contains(array[0])) { | |
| 166 chrName.add(array[0]); | |
| 167 chrStart.add(new Integer(linenumber)); | |
| 168 } | |
| 169 } | |
| 170 linenumber++; | |
| 171 } | |
| 172 chrStart.add(new Integer(linenumber)); | |
| 173 scan.close(); | |
| 174 } | |
| 175 | |
| 176 public static void loadConfig(String[] command){ | |
| 177 for (int i = 0; i < command.length; i++) { | |
| 178 switch (command[i].charAt((1))) { | |
| 179 case 'f': | |
| 180 READ1 = new File(command[i + 1]); | |
| 181 i++; | |
| 182 break; | |
| 183 case 'r': | |
| 184 READ2 = new File(command[i + 1]); | |
| 185 i++; | |
| 186 break; | |
| 187 case 'o': | |
| 188 OUTPUT = new File(command[i + 1]); | |
| 189 i++; | |
| 190 break; | |
| 191 case 'w': | |
| 192 WINDOW = Integer.parseInt(command[i + 1]); | |
| 193 i++; | |
| 194 break; | |
| 195 } | |
| 196 } | |
| 197 if(READ1 == null) { | |
| 198 System.out.println("No Read 1 File loaded!!!\n"); | |
| 199 printUsage(); | |
| 200 System.exit(0); | |
| 201 } | |
| 202 if(READ2 == null) { | |
| 203 System.out.println("No Read 2 File loaded!!!\n"); | |
| 204 printUsage(); | |
| 205 System.exit(0); | |
| 206 } | |
| 207 if(WINDOW < 1) { | |
| 208 System.out.println("Invalid Window Size Selected!!!\n"); | |
| 209 printUsage(); | |
| 210 System.exit(0); | |
| 211 } | |
| 212 | |
| 213 if(OUTPUT == null) { | |
| 214 OUTPUT = new File(READ1.getName().split("\\.")[0] + ".out"); | |
| 215 } | |
| 216 | |
| 217 System.out.println("-----------------------------------------\nCommand Line Arguments:"); | |
| 218 System.out.println("Read 1 file: " + READ1); | |
| 219 System.out.println("Read 2 file: " + READ2); | |
| 220 System.out.println("Output: " + OUTPUT); | |
| 221 System.out.println("Window Size: " + WINDOW); | |
| 222 } | |
| 223 | |
| 224 public static void printUsage() { | |
| 225 System.out.println("Usage: java -jar pairedendCrossPlot.jar -f [Read1File] -r [Read2File] [Options]"); | |
| 226 System.out.println("-----------------------------------------"); | |
| 227 System.out.println("\nRequired Parameter:"); | |
| 228 System.out.println("Read 1 File:\t\t\t-f\tRead 1 scIDX file"); | |
| 229 System.out.println("Read 2 File:\t\t\t-r\tRead 1 scIDX file"); | |
| 230 System.out.println("\nOptional Parameters:"); | |
| 231 System.out.println("Output File Name:\t\t-o\tOutput file"); | |
| 232 System.out.println("Window Size +/- Reference:\t-w\t(Default = 500)"); | |
| 233 } | |
| 234 | |
| 235 private static String getTimeStamp() { | |
| 236 Date date= new Date(); | |
| 237 String time = new Timestamp(date.getTime()).toString(); | |
| 238 return time; | |
| 239 } | |
| 240 | |
| 241 } |
