import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class Targets_read
{
private static Integer count=0;
private final static ArrayList<String> ref_list=getRef();
private final static Map<String, Integer> duiYing=getDuiying();
public static void main(String[] args) throws IOException, InterruptedException
{
if (args.length!=2) {
System.out.println("java -jar Targets_read.jar .bed nt");
System.exit(1);
}
long t1=System.currentTimeMillis();
ArrayList<Map<Integer,Integer>> chr=new ArrayList<>();
for (int i=0;i<25;i++) {
chr.add(new HashMap<>());
}
try (Scanner input=new Scanner(new File("/lustre/tianlab/ctDNA_targets_merge2.bed"));)
{
while (input.hasNextLine()) {
String line=input.nextLine();
String[] inter=line.trim().split("\\s+");
String flag=inter[0].substring(3);
int real_s=Integer.valueOf(inter[1])+1;
int real_e=Integer.valueOf(inter[2])+1;
if (ref_list.contains(flag)) {
for (int i=real_s;i<real_e;i++) {
chr.get(duiYing.get(flag)).putIfAbsent(i, 1);
}
}
}
}
ArrayList<String> reads_lst=new ArrayList<>();
try (BufferedReader bf=new BufferedReader(new FileReader(new File(args[0])));)
{
String line=null;
while ((line=bf.readLine())!=null) {
String[] inter=line.trim().split("\\s+");
String info=inter[0]+"-"+inter[1]+"-"+inter[2];
reads_lst.add(info);
}
}
ExecutorService executors=Executors.newFixedThreadPool(Integer.valueOf(args[1]));
for (String s:reads_lst) {
executors.execute(new Overlap(s, chr));
}
executors.shutdown();
executors.awaitTermination(Long.MAX_VALUE, TimeUnit.DAYS);
long t2=System.currentTimeMillis();
System.out.println(count);
System.out.println((t2-t1)/1000);
}
public static ArrayList<String> getRef()
{
ArrayList<String> list=new ArrayList<>();
for (int i=1;i<23;i++) {
list.add(String.valueOf(i));
}
list.add("X");
list.add("Y");
list.add("M");
return(list);
}
public static Map<String, Integer> getDuiying()
{
Map<String, Integer> duiYing=new HashMap<>();
for (int i=1;i<23;i++) {
duiYing.put(String.valueOf(i),i-1);
}
duiYing.put("X", 22);
duiYing.put("Y", 23);
duiYing.put("M", 24);
return(duiYing);
}
private static class Overlap implements Runnable
{
private String reads;
private ArrayList<Map<Integer,Integer>> chr;
private final static byte[] lock=new byte[0];
public Overlap(String reads,ArrayList<Map<Integer,Integer>> chr)
{
this.reads=reads;
this.chr=chr;
}
@Override
public void run()
{
String[] inter1=reads.split("-");
String chro=inter1[0].substring(3);
int start=Integer.valueOf(inter1[1])+1;
int end=Integer.valueOf(inter1[2])+1;
if (ref_list.contains(chro)) {
for (int i=start;i<end;i++) {
if (chr.get(duiYing.get(chro)).containsKey(i)) {
synchronized (lock) {
count++;
}
break;
}
}
}
}
}
}