#!/usr/bin/env python
# weili@jimmy.harvard.edu

import sys, os.path, time
import MAT.FileIO as FileIO
from MAT.Model import  ProbeModel
from MAT.Rep import Rep
from MAT.GenomeRetrieval import GenomeRetrieval
from MAT.TilingMap import TilingMap
from MAT.phastCons import phastCons


def Main(tag):
    nbed = {'P':1, 'N':1}
    for i, name in enumerate(sorted(tag.cel.keys())):
        # init
        bp = ProbeModel(tag.bpmapfolder+tag.bpmap[name], GenomeGrp = tag.genomegrp, outlier = tag.outlier)
        bp.nbed = nbed
        bp.ntrack = i + 1
        bp.cels = FileIO.Mycels(tag.celfolder+tag.cel[name], head = str(bp.outlier) + bp.checksum)        
        bar = FileIO.Mybars()

        # intensity analysis
        if bp.cels.iscel.any() :
            bp.FITMODEL()
            bp.READALL()
            bp.STANDARD()
        bp.MATSCORE(group = tag.group, BandWidth=tag.bandwidth, short = tag.minprobe, 
                      pair = tag.pair, var = tag.var, replicate = tag.diag)

        # raw t-values
        if tag.tvalue:
            bp.PRINTTVALUE(file = tag.out)
        bp.FDRTABLE(MaxGap = tag.maxgap, file = tag.out)
        if tag.wig:
            bar.SaveWiggle(bp, tag.out, content = tag.barfile)
        else:
            bar.Save(bp, tag.out, content = tag.barfile)


        # interval analysis
        bp.MATCUTOFF(FDR = tag.fdr, Pvalue = tag.pvalue, Matscore = tag.matscore)
        bp.REGIONCALL(MaxGap = tag.maxgap, extend = tag.extend)

        # add the repeat annotation to the final bed file
        if tag.replib:
            rep = Rep(tag.replib)
            bp.bed = rep.MarkBed(bp.bed, bp.ChrInd)
            bp.negbed = rep.MarkBed(bp.negbed, bp.ChrInd)
            rep = ''
        bp.PRINTBED(file = tag.out, blkname = os.path.basename(tag.out))

        # sequence retrieval
        if tag.genome:
            genome = GenomeRetrieval(tag.genome)
            genome.GetBedSeq(tag.out + '.bed', tag.out + '.seq')

        # diagnostics
        if tag.diag:
            from rpy import r
            r.pdf(tag.out + '.'+bp.bpmapname+ '.diagnoses.pdf', width = 8, height = 10)
            bp.MATscorePlot(r = r)              # MATscore plot
            bp.FDRTABLEPlot(r = r)              # FDR Table Plot
            bp.HEATMAP(tag.out, r = r)          # heat map
            bp.CLEAN()
            bp.cels = FileIO.Mycels(tag.celfolder+tag.cel[name])    # reload cel files
            bp.ProbePlot(r = r)                 # probe intensity vs. copy number
            bp.ProbeTvaluePlot(r = r)
            r.dev_off()

        # continue
        nbed = bp.nbed


def Misc(tag):
    # annotation mapping
    if tag.annotationfolder:
        for name in tag.annotation:
            ref = TilingMap(tag.annotationfolder + name)
            ref.Mapping(tag.out+'.bed', tag.out+ '.' + name + '.xls')
        print >> sys.stderr, 'Done annotations'

    # compress the bar files
    if tag.zip:
        FileIO.Zip(tag.out)

    # phastCons score plot
    if tag.phastCons_dir:
        phastCons(tag.out+'.bed',tag.phastCons_dir, tag.phastCons_range, tag.phastCons_win, tag.out)




#read program options
if __name__ == '__main__':
    from optparse import OptionParser
    parser = OptionParser(usage = "%prog [options] tag_files", \
                          version = "%prog Build 07312009")

    (options, args) = parser.parse_args()

    if len(sys.argv) <2:
        parser.print_help()
        sys.exit(0)

    for x in args:
        tag = FileIO.Tag(x)
        Main(tag)
        Misc(tag)

    print >> sys.stderr, 'Done [' + time.asctime() + ']' 

