comparison xena_import.py @ 0:8bb037f88ed2

Uploaded
author melissacline
date Tue, 13 Jan 2015 23:37:23 -0500
parents
children 6eeb3ca663fb
comparison
equal deleted inserted replaced
-1:000000000000 0:8bb037f88ed2
1 #!/usr/bin/env python
2
3 """
4 xena_import.py: import a dataset into Xena
5
6 Given a cmdline-specified genomic data file and a cmdline-specified Xena
7 directory, import the genomic data fle into Xena. This requires assembling
8 the necessary json file, based on cmdline input.
9 """
10
11 import argparse
12 import json
13 import os
14 import re
15 import shutil
16 import subprocess
17 import sys
18 import traceback
19 import xena_utils as xena
20
21 def updateColNormalization(jsonMetadata):
22 """Set colNormalization to TRUE if the data is of some expression-related
23 subtype and if colNormalization has not been set"""
24 if not jsonMetadata.has_key("colNormalization"):
25 if jsonMetadata.has_key("dataSubType"):
26 if re.search("expression", jsonMetadata['dataSubType'],
27 re.IGNORECASE):
28 jsonMetadata["colNormalization"] = "true"
29
30 def verifyAndImportExistingMetadata(inputJsonPath, outputJsonPath):
31 """Take an existing JSON file. Read the contents, and check for any
32 content that might be invalid in the local installation. Delete that
33 content. Write the rest to the indicated output pathname"""
34 problemFields = [":probeMap"]
35 fileContents = open(inputJsonPath).read()
36 jsonMetadata = json.loads(fileContents)
37 for thisProblem in problemFields:
38 if jsonMetadata.has_key(thisProblem):
39 del jsonMetadata[thisProblem]
40 updateColNormalization(jsonMetadata)
41 fp = open(outputJsonPath, "w")
42 fp.write("%s\n" % json.dumps(jsonMetadata, indent=2))
43 fp.close()
44
45
46 def main():
47 parser = argparse.ArgumentParser()
48 parser.add_argument("genomicDataPath", type=str)
49 parser.add_argument("outfile", type=str)
50 parser.add_argument("--json", type=str, default=None)
51 parser.add_argument("--cohort", type=str)
52 parser.add_argument("--type", type=str)
53 parser.add_argument("--dataSubType", type=str, default=None)
54 parser.add_argument("--label", type=str, default=None)
55 args = parser.parse_args()
56
57 fp2 = open(args.outfile, "w")
58 fp2.write("Importing data to Xena\n")
59 xenaFileDir = xena.fileDir()
60 genomicDataFile = args.genomicDataPath.split("/")[-1]
61 jsonMetadataTargetPathname = "%s/%s.json" % (xenaFileDir,
62 genomicDataFile)
63
64
65 # The metadata either came as the name of a JSON file or a series of
66 # command line arguments.
67 if args.json is not None:
68 # In this case, the metadata came in the form of a JSON file.
69 # Verify that the metadata is valid on the current system, which
70 # might mean altering it. Import the stuff that will validate.
71 verifyAndImportExistingMetadata(args.json, jsonMetadataTargetPathname)
72 else:
73 # In this case, the metadata came in the form of a series of
74 # command line arguments. Assemble them into JSON format,
75 # and write a JSON file into the Xena file directory.
76 metadata = { 'cohort': args.cohort, 'type': args.type }
77 if args.dataSubType is not None:
78 metadata['dataSubType'] = args.dataSubType
79 if args.label is not None:
80 metadata['label'] = args.label
81 jsonMetadata = json.dumps(metadata, indent=2)
82 fp = open(jsonMetadataTargetPathname, "w")
83 fp.write("%s\n" % (jsonMetadata))
84 fp.close()
85
86 # Finally, copy the genomic data into the Xena directory
87 shutil.copy(args.genomicDataPath, xenaFileDir)
88
89 # Set up the xena load comamnd and try to execute it. If an exception
90 # is generated, output a traceback and exit with nonzero status. If
91 # no exception was generated, indicate a successful import and exit
92 # with zero status.
93 xenaLoadCmd = "java -jar %s -l --force %s/%s -p %s" % (xena.jarPath(),
94 xenaFileDir,
95 genomicDataFile,
96 xena.port())
97 try:
98 subprocess.call(xenaLoadCmd, shell=True)
99 except:
100 exc_type, exc_value, exc_traceback = sys.exc_info()
101 lines = traceback.format_exception(exc_type, exc_value, exc_traceback)
102 allLines = ''.join('!! ' + line for line in lines)
103 fp2.write("Unsuccessful: error %s\n" % allLines)
104 fp2.close()
105 sys.exit(-1)
106 else:
107 fp2.write( "Import successful\n")
108 fp2.close()
109 sys.exit(0)
110
111
112 if __name__ == "__main__":
113 main()