snapshot of 4.0a development. initial git repo commit
[erange.git] / findMotifs.py
1 #
2 #  findMotifs.py
3 #  ENRAGE
4 #
5 try:
6     import psyco
7     psyco.full()
8 except:
9     pass
10
11 import sys, os, optparse
12 from cistematic.experiments.fasta import Fasta
13 from cistematic.programs.meme import Meme
14 from cistematic.programs.cisGreedy import CisGreedy
15 #TODO: cisSampler is not supported yet!
16 #from cistematic.programs.cisSampler import CisSampler
17
18 print "%prog: version 3.4"
19
20 def main(argv=None):
21     if not argv:
22         argv = sys.argv
23
24     usage = "usage: python %prog explabel regions.fsa [options]"
25
26     parser = optparse.OptionParser(usage=usage)
27     parser.add_option("--meme", action="store_true", dest="doMeme")
28     parser.add_option("--cisGreedy", action="store_true", dest="doCisGreedy")
29     parser.add_option("--logo", action="store_true", dest="saveLogo")
30     parser.add_option("--threshold", type="float", dest="threshold")
31     parser.add_option("--prefix", dest="motifPrefix")
32     parser.add_option("--numMotifs", dest="numMotifs")
33     parser.add_option("--maxWidth", type="int", dest="maxWidth")
34     parser.add_option("--maskLower", action="store_true", dest="maskLower")
35     parser.set_defaults(doMeme=False, doCisGreedy=False, saveLogo=False,
36                         threshold=75., numMotifs="10", maxWidth=28, maskLower=False)
37
38     (options, args) = parser.parse_args(argv[1:])
39
40     if len(args) < 2:
41         print usage
42         print "\n\twhere at least one of the motif finders (meme or cisGreedy) must be specified\n"
43         sys.exit(1)
44
45     expbase = args[0]
46     fsafile = args[1]
47
48     doCisSampler = False
49     if "--cisSampler" in sys.argv:
50         print "cisSampler is not supported yet! avoid using it for now"
51         doCisSampler = True
52
53     findMotifs(expbase, fsafile, options.doMeme, options.doCisGreedy, options.saveLogo,
54                options.threshold, options.numMotifs, options.maxWidth, options.maskLower,
55                doCisSampler)
56
57
58 def findMotifs(expbase, fsafile, doMeme=False, doCisGreedy=False, saveLogo=False, threshold=75.,
59                numMotifs="10", maxWidth=28, maskLower=False, doCisSampler=False):
60
61     motifPrefix = expbase
62
63     #TODO: cisSampler is not supported yet!
64     #if doMeme or doCisGreedy or doCisSampler:
65     if not (doMeme or doCisGreedy):
66         print "error: must specify at least one motif finder - exiting"
67         sys.exit(1)
68
69     exp = Fasta(expbase, "%s.db" % expbase)
70
71     exp.initialize()
72     if maskLower:
73         exp.setMaskLowerCase(True)
74
75     if doMeme:
76         prog4 = Meme()
77         prog4.setMaxWidth(maxWidth)
78         prog4.setNumMotifs(numMotifs)
79         prog4.setModel("zoops")
80         exp.appendProgram(prog4)
81
82     if doCisGreedy:
83         prog5 = CisGreedy()
84         prog5.setGenExpOptions([])
85         prog5.setMaxWidth(maxWidth)
86         prog5.setNumMotifs(numMotifs)
87         exp.appendProgram(prog5)
88
89     #TODO: cisSampler is not supported yet!
90     #if doCisSampler:
91     #    prog6 = CisSampler()
92     #    prog6.setGenExpOptions([])
93     #    prog6.setMaxWidth(maxWidth)
94     #    prog6.setNumMotifs(numMotifs)
95     #    exp.appendProgram(prog6)
96
97     exp.run(fsafile)
98     exp.createAnalysis()
99     exp.loadAnalysis()
100     exp.mapMotifs(threshold, verbose=False)
101     exp.exportMotifs(prefix = motifPrefix)
102     if saveLogo:
103         exp.exportLogos(prefix = motifPrefix)
104
105     exp.draw("%s.png" % expbase, maxOccurences=4000)
106     print "deleting database..."
107     del exp
108     os.remove("%s.db" % expbase)
109
110
111 if __name__ == "__main__":
112     main(sys.argv)