__author__ = 'Alena Zablotskaya, Vitaliy Istomov. Laboratory for Cytogenetics and Genome Research (Prof. Dr. Joris R. Vermeesch), KU Leuven, Leuven, Belgium'
#This script is used by the countTargetSpanning.sh script to calculate number of reads aligning to both sides of targets (i.e. fully spanning targets).
#Usage example: python3.4 /path/to/this/script/countOverlaps.py -t tag input_BED_file_with_intersections_between_reads_and_repeats.bed output_summary_file.txt

def process_input(input_filename, output_filename, tag):
    result = {}
    output_file = open(output_filename, "a")
    with open(input_filename) as input_file:
        for line in input_file:
            pieces = line.split("\t")
            locus_start = pieces[1]
            locus_end = pieces[2]
            seq_start = pieces[5]
            seq_end = pieces[6]
            seq_name = pieces[7]
            current_locus_content = result.get(locus_start + ":" + locus_end, None)
            if current_locus_content is None:
                result[locus_start + ":" + locus_end] = {seq_name: [seq_start, seq_end]}
            else:
                if current_locus_content.get(seq_name, None) is None:
                    current_locus_content[seq_name] = [seq_start, seq_end]
                else:
                    curr_start = current_locus_content[seq_name][0]
                    curr_end = current_locus_content[seq_name][1]
                    if seq_start < curr_start:
                        current_locus_content[seq_name][0] = seq_start
                    if seq_end > curr_end:
                        current_locus_content[seq_name][1] = seq_end
    result_sequences_set = set()
    result_covered_loci = set()
    for locus in result.keys():
        locus_borders = locus.split(":")
        for sequence_name in result[locus].keys():
            sequence_borders = result[locus][sequence_name]
            if (sequence_borders[0] <= locus_borders[0]) and (sequence_borders[1] >= locus_borders[1]):
                result_covered_loci.add(locus)
                result_sequences_set.add(sequence_name)
    output_file.write("READSspanningTargets" + tag + "\t" + str(len(result_sequences_set)) + "\n")
    output_file.write("REPEATSspanned" + tag + "\t" + str(len(result_covered_loci)) + "\n")

import sys
import argparse

def main():
    parser = argparse.ArgumentParser()
    parser.add_argument("input_file", help="Path to input BED file")
    parser.add_argument("output_file", help="Path to resulting file")
    parser.add_argument("-t", "--tag", help="Log tag", default="")
    args = parser.parse_args()
    print(args)
	process_input(args.input_file, args.output_file, args.tag)

if __name__ == "__main__":
    sys.exit(main())