diff --git a/README.md b/README.md new file mode 100644 index 0000000..a9e768e --- /dev/null +++ b/README.md @@ -0,0 +1,18 @@ +The TranSMART-XNAT-Importer plugin can import clinical image-derived data from XNAT and store them in TranSMART. + +![alt tag](https://raw.github.com/evast/transmart-xnat-importer-plugin/master/docs/navigator.png) +XNAT Data hierarchy shown in TranSMART ontology. + +TranSMART-XNAT Coupling +---------- + +TranSMART (http://transmartfoundation.org) is a data integration and browsing platform for central statistical analysis in translational research. + +XNAT (www.xnat.org) is a framework to store, share and manage medical imaging data. This imaging archive can be connected to a computing cluster for further image analyses. After analyses of the images, the analysis results (e.g. grey matter volumes) can be stored back in XNAT. + +To correlate the image-derived results with other medical data, such as demographic or genetic data, it would be useful to import the XNAT results in TranSMART. To this end, we developed the TranSMART-XNAT-Importer plugin. To configure which XNAT image-derived data is imported in TranSMART, an administrator can create a coupling configuration in the online administration panel and start the import process. The plugin uses the default ETL Importer for clinical data to import the XNAT results in TranSMART. + +Documentation and Installation +------------------------------ + +More information about the plugin and installation instructions can be found in [TranSMART-XNAT-Importer-plugin-manual.pdf](https://github.com/evast/transmart-xnat-importer-plugin/blob/master/docs/TranSMART-XNAT-Importer-plugin-manual.pdf?raw=true) in the directory docs. A user-guide to import data with step-by-step instructions and screenshots can be found in the same document. diff --git a/docs/documentation.docx b/docs/TranSMART-XNAT-Importer-plugin-manual.docx similarity index 90% rename from docs/documentation.docx rename to docs/TranSMART-XNAT-Importer-plugin-manual.docx index 48e351d..5d9a6ad 100644 Binary files a/docs/documentation.docx and b/docs/TranSMART-XNAT-Importer-plugin-manual.docx differ diff --git a/docs/TranSMART-XNAT-Importer-plugin-manual.pdf b/docs/TranSMART-XNAT-Importer-plugin-manual.pdf new file mode 100644 index 0000000..a16e3a5 Binary files /dev/null and b/docs/TranSMART-XNAT-Importer-plugin-manual.pdf differ diff --git a/docs/navigator.png b/docs/navigator.png new file mode 100644 index 0000000..0dc6ceb Binary files /dev/null and b/docs/navigator.png differ diff --git a/grails-app/controllers/ImportXnatController.groovy b/grails-app/controllers/ImportXnatController.groovy index c1a72c5..baa8364 100644 --- a/grails-app/controllers/ImportXnatController.groovy +++ b/grails-app/controllers/ImportXnatController.groovy @@ -1,4 +1,3 @@ -import org.springframework.util.StringUtils import org.transmart.searchapp.ImportXnatConfiguration; import org.transmart.searchapp.ImportXnatVariable; import groovy.xml.MarkupBuilder @@ -8,7 +7,6 @@ import groovy.xml.MarkupBuilder */ class ImportXnatController { - def springSecurityService def grailsApplication // the delete, save and update actions only accept POST requests @@ -176,13 +174,22 @@ class ImportXnatController { def kettledir = (getScriptsLocation() + "/xnattotransmartlink/") def datadir = (getScriptsLocation() + "/xnattotransmartlink/") - def process = ("python " + getScriptsLocation() + "/xnattotransmartlink/downloadscript.py ${url} ${username} ${password} ${project} ${node} ${kettledir} ${datadir}").execute(null, new File(getScriptsLocation() + "/xnattotransmartlink")) + def cmd = "python " + + getScriptsLocation() + + "/xnattotransmartlink/downloadscript.py" + + " ${url} ${username} ${password} ${project} ${node} ${kettledir} ${datadir}" + log.debug(cmd) + def process = (cmd).execute(null, new File(getScriptsLocation() + "/xnattotransmartlink")) process.waitFor() - if (process.err.text == "") { - flash.message = "${process.in.text}" + def inText = process.in.text + def errText = process.err.text + if (errText) { + log.error(errText) + flash.message = "${errText}
${inText}" } else { - flash.message = "${process.err.text}
${process.in.text}" - } + log.info(inText) + flash.message = inText + } redirect action: import_wizard, id: importXnatConfiguration.id } diff --git a/grails-app/ddl/postgres/import_xnat_configuration.sql b/grails-app/ddl/postgres/import_xnat_configuration.sql index ddd0513..6d2885e 100644 --- a/grails-app/ddl/postgres/import_xnat_configuration.sql +++ b/grails-app/ddl/postgres/import_xnat_configuration.sql @@ -13,7 +13,8 @@ CREATE TABLE searchapp.import_xnat_configuration ( ); ALTER TABLE searchapp.import_xnat_configuration OWNER TO searchapp; GRANT ALL ON TABLE searchapp.import_xnat_configuration TO searchapp; - +GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE searchapp.import_xnat_configuration TO biomart_user; +GRANT ALL ON TABLE searchapp.import_xnat_configuration TO tm_cz; -- -- Name: pk_import_xnat_configuration; Type: CONSTRAINT; Schema: searchapp; Owner: - -- diff --git a/grails-app/ddl/postgres/import_xnat_variable.sql b/grails-app/ddl/postgres/import_xnat_variable.sql index 6509a8d..d826d3e 100644 --- a/grails-app/ddl/postgres/import_xnat_variable.sql +++ b/grails-app/ddl/postgres/import_xnat_variable.sql @@ -10,7 +10,8 @@ CREATE TABLE searchapp.import_xnat_variable ( ); ALTER TABLE searchapp.import_xnat_variable OWNER TO searchapp; GRANT ALL ON TABLE searchapp.import_xnat_variable TO searchapp; - +GRANT SELECT, UPDATE, INSERT, DELETE ON TABLE searchapp.import_xnat_variable TO biomart_user; +GRANT ALL ON TABLE searchapp.import_xnat_variable TO tm_cz; -- -- Name: pk_import_xnat_var; Type: CONSTRAINT; Schema: searchapp; Owner: - -- diff --git a/scripts/xnattotransmartlink/command.sh b/scripts/xnattotransmartlink/command.sh index 69d1219..884c5df 100755 --- a/scripts/xnattotransmartlink/command.sh +++ b/scripts/xnattotransmartlink/command.sh @@ -1,9 +1,10 @@ #!/bin/bash -export KETTLE_HOME="/home/jenkins/transmart-data/env/tranSMART-ETL/Postgres/GPL-1.0/Kettle/Kettle-ETL/" +export TS_DATA="/home/transmart/transmart-data/" +export KETTLE_HOME="${TS_DATA}samples/postgres/kettle-home/" -sh "/home/jenkins/transmart-data/env/data-integration/kitchen.sh" \ +sh "${TS_DATA}env/data-integration/kitchen.sh" \ -norep=N \ --file="/home/jenkins/transmart-data/env/tranSMART-ETL/Kettle-GPL/Kettle-ETL/create_clinical_data.kjb" \ +-file="${TS_DATA}env/tranSMART-ETL/Postgres/GPL-1.0/Kettle/Kettle-ETL/create_clinical_data.kjb" \ -log=load_clinical_data.log \ -param:LOAD_TYPE=I \ -param:COLUMN_MAP_FILE=xnat.tmm \ diff --git a/scripts/xnattotransmartlink/downloadscript.py b/scripts/xnattotransmartlink/downloadscript.py index 252db87..e3ad876 100644 --- a/scripts/xnattotransmartlink/downloadscript.py +++ b/scripts/xnattotransmartlink/downloadscript.py @@ -3,7 +3,7 @@ import pyxnat import subprocess import sys -from elementtree.ElementTree import parse +from xml.etree.ElementTree import parse CONFIG_PATH = './' CONFIG_EXTENSION = ".xml"