| 1 | """ |
|---|
| 2 | released under the terms of the LGPL |
|---|
| 3 | copyright ross lazarus August 2007 |
|---|
| 4 | for the rgenetics project |
|---|
| 5 | |
|---|
| 6 | Special galaxy tool for the camp2007 data |
|---|
| 7 | Allows grabbing genotypes from an arbitrary region and estimating |
|---|
| 8 | ld using haploview |
|---|
| 9 | |
|---|
| 10 | stoopid haploview won't allow control of dest directory for plots - always end |
|---|
| 11 | up where the data came from - need to futz to get it where it belongs |
|---|
| 12 | |
|---|
| 13 | Needs a mongo results file in the location hardwired below or could be passed in as |
|---|
| 14 | a library parameter - but this file must have a very specific structure |
|---|
| 15 | rs chrom offset float1...floatn |
|---|
| 16 | |
|---|
| 17 | |
|---|
| 18 | """ |
|---|
| 19 | |
|---|
| 20 | |
|---|
| 21 | import sys, array, os, string, tempfile, shutil, subprocess, glob |
|---|
| 22 | from rgutils import galhtmlprefix |
|---|
| 23 | |
|---|
| 24 | progname = os.path.split(sys.argv[0])[1] |
|---|
| 25 | |
|---|
| 26 | javabin = 'java' |
|---|
| 27 | #hvbin = '/usr/local/bin/Haploview.jar' |
|---|
| 28 | #hvbin = '/home/universe/linux-i686/haploview/Haploview.jar' |
|---|
| 29 | # get this from tool as a parameter - can use |
|---|
| 30 | |
|---|
| 31 | |
|---|
| 32 | |
|---|
| 33 | atrandic = {'A':'1','C':'2','G':'3','T':'4','N':'0','-':'0','1':'1','2':'2','3':'3','4':'4','0':'0'} |
|---|
| 34 | |
|---|
| 35 | class NullDevice: |
|---|
| 36 | """ """ |
|---|
| 37 | def write(self, s): |
|---|
| 38 | pass |
|---|
| 39 | |
|---|
| 40 | def ld(): |
|---|
| 41 | """ ### Sanity check the arguments |
|---|
| 42 | |
|---|
| 43 | <command interpreter="python"> |
|---|
| 44 | rgHaploView.py "$ucsc_region" "$rslist" "$title" "$out_file1" |
|---|
| 45 | "$lhistIn.extra_files_path" "$lhistIn.metadata.base_name" |
|---|
| 46 | "$minmaf" "$maxdist" "$ldtype" "$hires" "$memsize" "$out_file1.files_path" |
|---|
| 47 | "$infoTrack" "$tagr2" "$hmpanel" ${GALAXY_DATA_INDEX_DIR}/rg/bin/haploview.jar |
|---|
| 48 | </command> |
|---|
| 49 | |
|---|
| 50 | remember to figure out chromosome and complain if > 1? |
|---|
| 51 | and use the -chromosome <1-22,X,Y> parameter to haploview |
|---|
| 52 | skipcheck? |
|---|
| 53 | """ |
|---|
| 54 | progname = os.path.split(sys.argv[0])[-1] |
|---|
| 55 | ts = '%s%s' % (string.punctuation,string.whitespace) |
|---|
| 56 | ptran = string.maketrans(ts,'_'*len(ts)) |
|---|
| 57 | if len(sys.argv) < 16: |
|---|
| 58 | s = '##!%s: Expected 16 params in sys.argv, got %d (%s)' % (progname,len(sys.argv), sys.argv) |
|---|
| 59 | print s |
|---|
| 60 | sys.exit(1) |
|---|
| 61 | |
|---|
| 62 | ### Figure out what genomic region we are interested in |
|---|
| 63 | region = sys.argv[1] |
|---|
| 64 | orslist = sys.argv[2].replace('X',' ').lower() # galaxy replaces newlines with XX - go figure |
|---|
| 65 | title = sys.argv[3].translate(ptran) |
|---|
| 66 | # for outputs |
|---|
| 67 | outfile = sys.argv[4] |
|---|
| 68 | logfn = 'Log_%s.txt' % (title) |
|---|
| 69 | histextra = sys.argv[5] |
|---|
| 70 | base_name = sys.argv[6] |
|---|
| 71 | pedFileBase = os.path.join(histextra,base_name) |
|---|
| 72 | print 'pedfilebase=%s' % pedFileBase |
|---|
| 73 | minMaf=sys.argv[7] |
|---|
| 74 | if minMaf: |
|---|
| 75 | try: |
|---|
| 76 | minMaf = float(minMaf) |
|---|
| 77 | except: |
|---|
| 78 | minMaf = 0.0 |
|---|
| 79 | maxDist=sys.argv[8] or None |
|---|
| 80 | ldType=sys.argv[9] or 'RSQ' |
|---|
| 81 | hiRes = (sys.argv[10].lower() == 'hi') |
|---|
| 82 | memSize= sys.argv[11] or '1000' |
|---|
| 83 | memSize = int(memSize) |
|---|
| 84 | outfpath = sys.argv[12] |
|---|
| 85 | infotrack = False # note that otherwise this breaks haploview in headless mode |
|---|
| 86 | #infotrack = sys.argv[13] == 'info' |
|---|
| 87 | # this fails in headless mode as at april 2010 with haploview 4.2 |
|---|
| 88 | tagr2 = sys.argv[14] or '0.8' |
|---|
| 89 | hmpanels = sys.argv[15] # eg "['CEU','YRI']" |
|---|
| 90 | if hmpanels: |
|---|
| 91 | hmpanels = hmpanels.replace('[','') |
|---|
| 92 | hmpanels = hmpanels.replace(']','') |
|---|
| 93 | hmpanels = hmpanels.replace("'",'') |
|---|
| 94 | hmpanels = hmpanels.split(',') |
|---|
| 95 | hvbin = sys.argv[16] # added rml june 2008 |
|---|
| 96 | bindir = os.path.split(hvbin)[0] |
|---|
| 97 | # jan 2010 - always assume utes are on path to avoid platform problems |
|---|
| 98 | pdfjoin = 'pdfjoin' # os.path.join(bindir,'pdfjoin') |
|---|
| 99 | pdfnup = 'pdfnup' # os.path.join(bindir,'pdfnup') |
|---|
| 100 | mogrify = 'mogrify' # os.path.join(bindir,'mogrify') |
|---|
| 101 | convert = 'convert' # os.path.join(bindir,'convert') |
|---|
| 102 | log_file = os.path.join(outfpath,logfn) |
|---|
| 103 | MAP_FILE = '%s.map' % pedFileBase |
|---|
| 104 | DATA_FILE = '%s.ped' % pedFileBase |
|---|
| 105 | try: |
|---|
| 106 | os.makedirs(outfpath) |
|---|
| 107 | s = '## made new path %s\n' % outfpath |
|---|
| 108 | except: |
|---|
| 109 | pass |
|---|
| 110 | lf = file(log_file,'w') |
|---|
| 111 | s = 'PATH=%s\n' % os.environ.get('PATH','?') |
|---|
| 112 | lf.write(s) |
|---|
| 113 | hlogf = os.path.join(outfpath,'%s.log' % pedFileBase) |
|---|
| 114 | chromosome = '' |
|---|
| 115 | spos = epos = -9 |
|---|
| 116 | rslist = [] |
|---|
| 117 | rsdict = {} |
|---|
| 118 | hlog = [] |
|---|
| 119 | |
|---|
| 120 | if region > '': |
|---|
| 121 | useRs = [] |
|---|
| 122 | useRsdict={} |
|---|
| 123 | try: # TODO make a regexp? |
|---|
| 124 | c,rest = region.split(':') |
|---|
| 125 | chromosome = c.replace('chr','') |
|---|
| 126 | rest = rest.replace(',','') # remove commas |
|---|
| 127 | spos,epos = rest.split('-') |
|---|
| 128 | spos = int(spos) |
|---|
| 129 | epos = int(epos) |
|---|
| 130 | s = '## %s parsing chrom %s from %d to %d\n' % (progname,chromosome,spos,epos) |
|---|
| 131 | lf.write(s) |
|---|
| 132 | lf.write('\n') |
|---|
| 133 | print >> sys.stdout, s |
|---|
| 134 | except: |
|---|
| 135 | s = '##! %s unable to parse region %s - MUST look like "chr8:10,000-100,000\n' % (progname,region) |
|---|
| 136 | print >> sys.stdout, s |
|---|
| 137 | lf.write(s) |
|---|
| 138 | lf.write('\n') |
|---|
| 139 | lf.close() |
|---|
| 140 | sys.exit(1) |
|---|
| 141 | else: |
|---|
| 142 | useRs = orslist.split() # galaxy replaces newlines with XX - go figure |
|---|
| 143 | useRsdict = dict(zip(useRs,useRs)) |
|---|
| 144 | useTemp = False |
|---|
| 145 | try: |
|---|
| 146 | dfile = open(DATA_FILE, 'r') |
|---|
| 147 | except: # bad input file name? |
|---|
| 148 | s = '##! RGeno unable to open file %s\n' % (DATA_FILE) |
|---|
| 149 | lf.write(s) |
|---|
| 150 | lf.write('\n') |
|---|
| 151 | lf.close() |
|---|
| 152 | print >> sys.stdout, s |
|---|
| 153 | raise |
|---|
| 154 | sys.exit(1) |
|---|
| 155 | try: |
|---|
| 156 | mfile = open(MAP_FILE, 'r') |
|---|
| 157 | except: # bad input file name? |
|---|
| 158 | s = '##! RGeno unable to open file %s' % (MAP_FILE) |
|---|
| 159 | lf.write(s) |
|---|
| 160 | lf.write('\n') |
|---|
| 161 | lf.close() |
|---|
| 162 | print >> sys.stdout, s |
|---|
| 163 | raise |
|---|
| 164 | sys.exit(1) |
|---|
| 165 | if len(useRs) > 0 or spos <> -9 : # subset region |
|---|
| 166 | useTemp = True |
|---|
| 167 | ### Figure out which markers are in this region |
|---|
| 168 | markers = [] |
|---|
| 169 | snpcols = {} |
|---|
| 170 | chroms = {} |
|---|
| 171 | minpos = 2**32 |
|---|
| 172 | maxpos = 0 |
|---|
| 173 | for lnum,row in enumerate(mfile): |
|---|
| 174 | line = row.strip() |
|---|
| 175 | if not line: continue |
|---|
| 176 | chrom, snp, genpos, abspos = line.split() |
|---|
| 177 | try: |
|---|
| 178 | ic = int(chrom) |
|---|
| 179 | except: |
|---|
| 180 | ic = None |
|---|
| 181 | if ic and ic <= 23: |
|---|
| 182 | try: |
|---|
| 183 | abspos = int(abspos) |
|---|
| 184 | if abspos > maxpos: |
|---|
| 185 | maxpos = abspos |
|---|
| 186 | if abspos < minpos: |
|---|
| 187 | minpos = abspos |
|---|
| 188 | except: |
|---|
| 189 | abspos = epos + 999999999 # so next test fails |
|---|
| 190 | if useRsdict.get(snp,None) or (spos <> -9 and chrom == chromosome and (spos <= abspos <= epos)): |
|---|
| 191 | if chromosome == '': |
|---|
| 192 | chromosome = chrom |
|---|
| 193 | chroms.setdefault(chrom,chrom) |
|---|
| 194 | markers.append((chrom,abspos,snp)) # decorate for sort into genomic |
|---|
| 195 | snpcols[snp] = lnum # so we know which col to find genos for this marker |
|---|
| 196 | markers.sort() |
|---|
| 197 | rslist = [x[2] for x in markers] # drop decoration |
|---|
| 198 | rsdict = dict(zip(rslist,rslist)) |
|---|
| 199 | if len(rslist) == 0: |
|---|
| 200 | s = '##! %s found no rs numbers in %s' % (progname,sys.argv[1:3]) |
|---|
| 201 | lf.write(s) |
|---|
| 202 | lf.write('\n') |
|---|
| 203 | lf.close() |
|---|
| 204 | print >> sys.stdout, s |
|---|
| 205 | sys.exit(1) |
|---|
| 206 | if spos == -9: |
|---|
| 207 | spos = minpos |
|---|
| 208 | epos = maxpos |
|---|
| 209 | s = '## %s looking for %d rs (%s)' % (progname,len(rslist),rslist[:5]) |
|---|
| 210 | lf.write(s) |
|---|
| 211 | print >> sys.stdout, s |
|---|
| 212 | wewant = [(6+(2*snpcols[x])) for x in rslist] # |
|---|
| 213 | # column indices of first geno of each marker pair to get the markers into genomic |
|---|
| 214 | ### ... and then parse the rest of the ped file to pull out |
|---|
| 215 | ### the genotypes for all subjects for those markers |
|---|
| 216 | # /usr/local/galaxy/data/rg/1/lped/ |
|---|
| 217 | tempMapName = os.path.join(outfpath,'%s.info' % title) |
|---|
| 218 | tempMap = file(tempMapName,'w') |
|---|
| 219 | tempPedName = os.path.join(outfpath,'%s.ped' % title) |
|---|
| 220 | tempPed = file(tempPedName,'w') |
|---|
| 221 | pngpath = '%s.LD.PNG' % tempPedName |
|---|
| 222 | map = ['%s\t%s' % (x[2],x[1]) for x in markers] # snp,abspos in genomic order for haploview |
|---|
| 223 | tempMap.write('%s\n' % '\n'.join(map)) |
|---|
| 224 | tempMap.close() |
|---|
| 225 | nrows = 0 |
|---|
| 226 | for line in dfile: |
|---|
| 227 | line = line.strip() |
|---|
| 228 | if not line: |
|---|
| 229 | continue |
|---|
| 230 | fields = line.split() |
|---|
| 231 | preamble = fields[:6] |
|---|
| 232 | g = ['%s %s' % (fields[snpcol], fields[snpcol+1]) for snpcol in wewant] |
|---|
| 233 | g = ' '.join(g) |
|---|
| 234 | g = g.split() # we'll get there |
|---|
| 235 | g = [atrandic.get(x,'0') for x in g] # numeric alleles... |
|---|
| 236 | tempPed.write('%s %s\n' % (' '.join(preamble), ' '.join(g))) |
|---|
| 237 | nrows += 1 |
|---|
| 238 | tempPed.close() |
|---|
| 239 | s = '## %s: wrote %d markers, %d subjects for region %s\n' % (progname,len(rslist),nrows,region) |
|---|
| 240 | lf.write(s) |
|---|
| 241 | lf.write('\n') |
|---|
| 242 | print >> sys.stdout,s |
|---|
| 243 | else: # even if using all, must set up haploview info file instead of map |
|---|
| 244 | markers = [] |
|---|
| 245 | chroms = {} |
|---|
| 246 | spos = sys.maxint |
|---|
| 247 | epos = -spos |
|---|
| 248 | for lnum,row in enumerate(mfile): |
|---|
| 249 | line = row.strip() |
|---|
| 250 | if not line: continue |
|---|
| 251 | chrom, snp, genpos, abspos = line.split() |
|---|
| 252 | try: |
|---|
| 253 | ic = int(chrom) |
|---|
| 254 | except: |
|---|
| 255 | ic = None |
|---|
| 256 | if ic and ic <= 23: |
|---|
| 257 | if chromosome == '': |
|---|
| 258 | chromosome = chrom |
|---|
| 259 | chroms.setdefault(chrom,chrom) |
|---|
| 260 | try: |
|---|
| 261 | p = int(abspos) |
|---|
| 262 | if p < spos and p <> 0: |
|---|
| 263 | spos = p |
|---|
| 264 | if p > epos and p <> 0: |
|---|
| 265 | epos = p |
|---|
| 266 | except: |
|---|
| 267 | pass |
|---|
| 268 | markers.append('%s %s' % (snp,abspos)) # no sort - pass |
|---|
| 269 | # now have spos and epos for hapmap if hmpanels |
|---|
| 270 | tempMapName = os.path.join(outfpath,'%s.info' % title) |
|---|
| 271 | tempMap = file(tempMapName,'w') |
|---|
| 272 | tempMap.write('\n'.join(markers)) |
|---|
| 273 | tempMap.close() |
|---|
| 274 | tempPedName = os.path.join(outfpath,'%s.ped' % title) |
|---|
| 275 | try: # will fail on winblows! |
|---|
| 276 | os.symlink(DATA_FILE,tempPedName) |
|---|
| 277 | except: |
|---|
| 278 | shutil.copy(DATA_FILE,tempPedName) # wasteful but.. |
|---|
| 279 | nchroms = len(chroms) # if > 1 can't really do this safely |
|---|
| 280 | if nchroms > 1: |
|---|
| 281 | s = '## warning - multiple chromosomes found in your map file - %s\n' % ','.join(chroms.keys()) |
|---|
| 282 | lf.write(s) |
|---|
| 283 | print >> sys.stdout,s |
|---|
| 284 | sys.exit(1) |
|---|
| 285 | DATA_FILE = tempPedName # for haploview |
|---|
| 286 | INFO_FILE = tempMapName |
|---|
| 287 | dfile.close() |
|---|
| 288 | mfile.close() |
|---|
| 289 | fblog,blog = tempfile.mkstemp() |
|---|
| 290 | ste = open(blog,'w') # to catch the blather |
|---|
| 291 | # if no need to rewrite - set up names for haploview call |
|---|
| 292 | vcl = [javabin,'-jar',hvbin,'-n','-memory','%d' % memSize,'-pairwiseTagging', |
|---|
| 293 | '-pedfile',DATA_FILE,'-info',INFO_FILE,'-tagrsqcounts', |
|---|
| 294 | '-tagrsqcutoff',tagr2, |
|---|
| 295 | '-ldcolorscheme',ldType] |
|---|
| 296 | if minMaf: |
|---|
| 297 | vcl += ['-minMaf','%f' % minMaf] |
|---|
| 298 | if maxDist: |
|---|
| 299 | vcl += ['-maxDistance',maxDist] |
|---|
| 300 | if hiRes: |
|---|
| 301 | vcl.append('-png') |
|---|
| 302 | else: |
|---|
| 303 | vcl.append('-compressedpng') |
|---|
| 304 | if nchroms == 1: |
|---|
| 305 | vcl += ['-chromosome',chromosome] |
|---|
| 306 | if infotrack: |
|---|
| 307 | vcl.append('-infoTrack') |
|---|
| 308 | p=subprocess.Popen(' '.join(vcl),shell=True,cwd=outfpath,stderr=ste,stdout=lf) |
|---|
| 309 | retval = p.wait() |
|---|
| 310 | s = '## executing %s returned %d\n' % (' '.join(vcl),retval) |
|---|
| 311 | lf.write(s) |
|---|
| 312 | vcl = [mogrify, '-resize 800x400!', '*.PNG'] |
|---|
| 313 | p=subprocess.Popen(' '.join(vcl),shell=True,cwd=outfpath,stderr=lf,stdout=lf) |
|---|
| 314 | retval = p.wait() |
|---|
| 315 | s = '## executing %s returned %d\n' % (' '.join(vcl),retval) |
|---|
| 316 | lf.write(s) |
|---|
| 317 | inpng = '%s.LD.PNG' % DATA_FILE # stupid but necessary - can't control haploview name mangle |
|---|
| 318 | inpng = inpng.replace(' ','') |
|---|
| 319 | inpng = os.path.split(inpng)[-1] |
|---|
| 320 | tmppng = '%s.tmp.png' % title |
|---|
| 321 | tmppng = tmppng.replace(' ','') |
|---|
| 322 | outpng = '1_%s.png' % title |
|---|
| 323 | outpng = outpng.replace(' ','') |
|---|
| 324 | outpng = os.path.split(outpng)[-1] |
|---|
| 325 | vcl = [convert, '-resize 800x400!', inpng, tmppng] |
|---|
| 326 | p=subprocess.Popen(' '.join(vcl),shell=True,cwd=outfpath,stderr=lf,stdout=lf) |
|---|
| 327 | retval = p.wait() |
|---|
| 328 | s = '## executing %s returned %d\n' % (' '.join(vcl),retval) |
|---|
| 329 | lf.write(s) |
|---|
| 330 | s = "text 10,300 '%s'" % title[:40] |
|---|
| 331 | vcl = ['convert', '-pointsize 25','-fill maroon', |
|---|
| 332 | '-draw "%s"' % s, tmppng, outpng] |
|---|
| 333 | p=subprocess.Popen(' '.join(vcl),shell=True,cwd=outfpath,stderr=lf,stdout=lf) |
|---|
| 334 | retval = p.wait() |
|---|
| 335 | s = '## executing %s returned %d\n' % (' '.join(vcl),retval) |
|---|
| 336 | lf.write(s) |
|---|
| 337 | try: |
|---|
| 338 | os.remove(os.path.join(outfpath,tmppng)) |
|---|
| 339 | except: |
|---|
| 340 | pass # label all the plots then delete all the .PNG files before munging |
|---|
| 341 | fnum=1 |
|---|
| 342 | if hmpanels: |
|---|
| 343 | sp = '%d' % (spos/1000.) # hapmap wants kb |
|---|
| 344 | ep = '%d' % (epos/1000.) |
|---|
| 345 | for panel in hmpanels: |
|---|
| 346 | if panel > '' and panel.lower() <> 'none': # in case someone checks that option too :) |
|---|
| 347 | ptran = panel.strip() |
|---|
| 348 | ptran = ptran.replace('+','_') |
|---|
| 349 | fnum += 1 # preserve an order or else we get sorted |
|---|
| 350 | vcl = [javabin,'-jar',hvbin,'-n','-memory','%d' % memSize, |
|---|
| 351 | '-chromosome',chromosome, '-panel',panel.strip(), |
|---|
| 352 | '-hapmapDownload','-startpos',sp,'-endpos',ep, |
|---|
| 353 | '-ldcolorscheme',ldType] |
|---|
| 354 | if minMaf: |
|---|
| 355 | vcl += ['-minMaf','%f' % minMaf] |
|---|
| 356 | if maxDist: |
|---|
| 357 | vcl += ['-maxDistance',maxDist] |
|---|
| 358 | if hiRes: |
|---|
| 359 | vcl.append('-png') |
|---|
| 360 | else: |
|---|
| 361 | vcl.append('-compressedpng') |
|---|
| 362 | if infotrack: |
|---|
| 363 | vcl.append('-infoTrack') |
|---|
| 364 | p=subprocess.Popen(' '.join(vcl),shell=True,cwd=outfpath,stderr=ste,stdout=lf) |
|---|
| 365 | retval = p.wait() |
|---|
| 366 | inpng = 'Chromosome%s%s.LD.PNG' % (chromosome,panel) |
|---|
| 367 | inpng = inpng.replace(' ','') # mysterious spaces! |
|---|
| 368 | outpng = '%d_HapMap_%s_%s.png' % (fnum,ptran,chromosome,) |
|---|
| 369 | # hack for stupid chb+jpt |
|---|
| 370 | outpng = outpng.replace(' ','') |
|---|
| 371 | tmppng = '%s.tmp.png' % title |
|---|
| 372 | tmppng = tmppng.replace(' ','') |
|---|
| 373 | outpng = os.path.split(outpng)[-1] |
|---|
| 374 | vcl = [convert, '-resize 800x400!', inpng, tmppng] |
|---|
| 375 | p=subprocess.Popen(' '.join(vcl),shell=True,cwd=outfpath,stderr=lf,stdout=lf) |
|---|
| 376 | retval = p.wait() |
|---|
| 377 | s = '## executing %s returned %d\n' % (' '.join(vcl),retval) |
|---|
| 378 | lf.write(s) |
|---|
| 379 | s = "text 10,300 'HapMap %s'" % ptran.strip() |
|---|
| 380 | vcl = [convert, '-pointsize 25','-fill maroon', |
|---|
| 381 | '-draw "%s"' % s, tmppng, outpng] |
|---|
| 382 | p=subprocess.Popen(' '.join(vcl),shell=True,cwd=outfpath,stderr=lf,stdout=lf) |
|---|
| 383 | retval = p.wait() |
|---|
| 384 | s = '## executing %s returned %d\n' % (' '.join(vcl),retval) |
|---|
| 385 | lf.write(s) |
|---|
| 386 | try: |
|---|
| 387 | os.remove(os.path.join(outfpath,tmppng)) |
|---|
| 388 | except: |
|---|
| 389 | pass |
|---|
| 390 | nimages = len(glob.glob(os.path.join(outfpath,'*.png'))) # rely on HaploView shouting - PNG @! |
|---|
| 391 | lf.write('### nimages=%d\n' % nimages) |
|---|
| 392 | if nimages > 0: # haploview may fail? |
|---|
| 393 | vcl = '%s -format pdf -resize 800x400! *.png' % mogrify |
|---|
| 394 | p=subprocess.Popen(vcl,shell=True,cwd=outfpath,stderr=lf,stdout=lf) |
|---|
| 395 | retval = p.wait() |
|---|
| 396 | lf.write('## executing %s returned %d\n' % (vcl,retval)) |
|---|
| 397 | vcl = '%s "*.pdf" --fitpaper true --outfile alljoin.pdf' % pdfjoin |
|---|
| 398 | p=subprocess.Popen(vcl,shell=True,cwd=outfpath,stderr=lf,stdout=lf) |
|---|
| 399 | retval = p.wait() |
|---|
| 400 | lf.write('## executing %s returned %d\n' % (vcl,retval)) |
|---|
| 401 | vcl = '%s alljoin.pdf --nup 1x%d --outfile allnup.pdf' % (pdfnup,nimages) |
|---|
| 402 | p=subprocess.Popen(vcl,shell=True,cwd=outfpath,stderr=lf,stdout=lf) |
|---|
| 403 | retval = p.wait() |
|---|
| 404 | lf.write('## executing %s returned %d\n' % (vcl,retval)) |
|---|
| 405 | #vcl = ['convert', 'allnup.pdf', 'allnup.png'] # this fails - bad pdf? |
|---|
| 406 | #p=subprocess.Popen(' '.join(vcl),shell=True,cwd=outfpath) |
|---|
| 407 | #retval = p.wait() |
|---|
| 408 | #lf.write('## executing %s returned %d\n' % (vcl,retval)) |
|---|
| 409 | lf.write('\n'.join(hlog)) |
|---|
| 410 | ste.close() # temp file used to catch haploview blather |
|---|
| 411 | hblather = open(blog,'r').readlines() # to catch the blather |
|---|
| 412 | os.unlink(blog) |
|---|
| 413 | if len(hblather) > 0: |
|---|
| 414 | lf.write('## In addition, Haploview complained:') |
|---|
| 415 | lf.write(''.join(hblather)) |
|---|
| 416 | lf.write('\n') |
|---|
| 417 | lf.close() |
|---|
| 418 | flist = glob.glob(os.path.join(outfpath, '*')) |
|---|
| 419 | flist.sort() |
|---|
| 420 | ts = '!"#$%&\'()*+,-/:;<=>?@[\\]^_`{|}~' + string.whitespace |
|---|
| 421 | ftran = string.maketrans(ts,'_'*len(ts)) |
|---|
| 422 | outf = file(outfile,'w') |
|---|
| 423 | outf.write(galhtmlprefix % progname) |
|---|
| 424 | s = '<h4>rgenetics for Galaxy %s, wrapping HaploView</h4>' % (progname) |
|---|
| 425 | outf.write(s) |
|---|
| 426 | """ |
|---|
| 427 | as at ashg 2009, convert fails on allnup.pdf - probably too complex... |
|---|
| 428 | mainthumb = 'allnup.png' |
|---|
| 429 | mainpdf = 'allnup.pdf' |
|---|
| 430 | if os.path.exists(mainpdf): |
|---|
| 431 | if not os.path.exists(mainthumb): |
|---|
| 432 | outf.write('<table><tr><td colspan="3"><a href="%s">Main combined LD plot</a></td></tr></table>\n' % (mainpdf)) |
|---|
| 433 | else: |
|---|
| 434 | outf.write('<table><tr><td><a href="%s"><img src="%s" alt="Main combined LD image" hspace="10" align="middle">') |
|---|
| 435 | outf.write('</td><td>Click this thumbnail to display the main combined LD image</td></tr></table>\n' % (mainpdf,mainthumb)) |
|---|
| 436 | else: |
|---|
| 437 | outf.write('(No main image was generated - this usually means a Haploview error connecting to Hapmap site - please try later)<br/>\n') |
|---|
| 438 | outf.write('## Called as %s' % sys.argv) |
|---|
| 439 | """ |
|---|
| 440 | outf.write('<br><div><hr><ul>\n') |
|---|
| 441 | for i, data in enumerate( flist ): |
|---|
| 442 | dn = os.path.split(data)[-1] |
|---|
| 443 | if dn[:3] <> 'all': |
|---|
| 444 | continue |
|---|
| 445 | newdn = dn.translate(ftran) |
|---|
| 446 | if dn <> newdn: |
|---|
| 447 | os.rename(os.path.join(outfpath,dn),os.path.join(outfpath,newdn)) |
|---|
| 448 | dn = newdn |
|---|
| 449 | dnlabel = dn |
|---|
| 450 | ext = dn.split('.')[-1] |
|---|
| 451 | if dn == 'allnup.pdf': |
|---|
| 452 | dnlabel = 'All pdf plots on a single page' |
|---|
| 453 | elif dn == 'alljoin.pdf': |
|---|
| 454 | dnlabel = 'All pdf plots, each on a separate page' |
|---|
| 455 | outf.write('<li><a href="%s">%s - %s</a></li>\n' % (dn,dn,dnlabel)) |
|---|
| 456 | for i, data in enumerate( flist ): |
|---|
| 457 | dn = os.path.split(data)[-1] |
|---|
| 458 | if dn[:3] == 'all': |
|---|
| 459 | continue |
|---|
| 460 | newdn = dn.translate(ftran) |
|---|
| 461 | if dn <> newdn: |
|---|
| 462 | os.rename(os.path.join(outfpath,dn),os.path.join(outfpath,newdn)) |
|---|
| 463 | dn = newdn |
|---|
| 464 | dnlabel = dn |
|---|
| 465 | ext = dn.split('.')[-1] |
|---|
| 466 | if dn == 'allnup.pdf': |
|---|
| 467 | dnlabel = 'All pdf plots on a single page' |
|---|
| 468 | elif dn == 'alljoin.pdf': |
|---|
| 469 | dnlabel = 'All pdf plots, each on a separate page' |
|---|
| 470 | elif ext == 'info': |
|---|
| 471 | dnlabel = '%s map data for Haploview input' % title |
|---|
| 472 | elif ext == 'ped': |
|---|
| 473 | dnlabel = '%s genotype data for Haploview input' % title |
|---|
| 474 | elif dn.find('CEU') <> -1 or dn.find('YRI') <> -1 or dn.find('CHB_JPT') <> -1: # is hapmap |
|---|
| 475 | dnlabel = 'Hapmap data' |
|---|
| 476 | if ext == 'TAGS' or ext == 'TESTS' or ext == 'CHAPS': |
|---|
| 477 | dnlabel = dnlabel + ' Tagger output' |
|---|
| 478 | outf.write('<li><a href="%s">%s - %s</a></li>\n' % (dn,dn,dnlabel)) |
|---|
| 479 | outf.write('</ol><br>') |
|---|
| 480 | outf.write("</div><div><hr>Job Log follows below (see %s)<pre>" % logfn) |
|---|
| 481 | s = file(log_file,'r').readlines() |
|---|
| 482 | s = '\n'.join(s) |
|---|
| 483 | outf.write('%s</pre><hr></div>' % s) |
|---|
| 484 | outf.write('</body></html>') |
|---|
| 485 | outf.close() |
|---|
| 486 | if useTemp: |
|---|
| 487 | try: |
|---|
| 488 | os.unlink(tempMapName) |
|---|
| 489 | os.unlink(tempPedName) |
|---|
| 490 | except: |
|---|
| 491 | pass |
|---|
| 492 | |
|---|
| 493 | if __name__ == "__main__": |
|---|
| 494 | ld() |
|---|
| 495 | |
|---|