extensible neuroimaging archive toolkit (xnat) washington university neuroinformatics group
TRANSCRIPT
eXtensible Neuroimaging Archive Toolkit (XNAT)
Washington University Neuroinformatics Group
What is XNAT?
An environment for developing experimental data archives (data store & archiving tools).
Data store: • relational database for non-image data • specified directory structure for image data.
Archiving tools:• Web application for uploading, entering, searching,
visualizing, and otherwise exploring data.• Command-line tools for batch handling data.
Why do we need XNAT (or something like it)?
Raw images
Raw images
MetadataMetadata
AssessmentsAssessments
Demographics
Demographics
Processed images
Processed images
Deriveddata
Deriveddata
Why do we need XNAT (or something like it)?
Integrated Data Store Secure User Interface
Assessments
Subject MR Session
Raw Processed
Derived
Demographics Metadata
What is XML Schema?
XML Schema is a language for describing the structure and contents of an XML document.
<Class>Bird</Class> <xs:element name=“Class">
<xs:simpleType>
<xs:restriction base="xs:string">
<xs:enumeration value="Bird"/>
<xs:enumeration value="Mammal"/>
<xs:enumeration value="Reptile"/>
<xs:enumeration value="Fish"/>
</xs:restriction>
</xs:simpleType>
</xs:element>
XML XML Schema
XML Schema is the lingua franca for data exchange
Data exchange requires standard open data formats.
XML Schema is the language in which these open formats are defined.
Many fields (e.g. genetics, medicine) have already implemented XML Schema-based standards.
So an application that automatically archives, searches, and displays XML Schema-based data would be really useful…
Data Documents
Welcome to XNAT
XNATGenerator
<?xml version="1.0" encoding="UTF-8"?><xs:schema xmlns:xnat="xnat.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"><xs:element name="Database"><xs:annotation><xs:appinfo><xnat:dbinfo database.name="CNDA" database="MYSQL"/></xs:appinfo></xs:annotation></xs:element><xs:element name="wm_mod_scheltens"><xs:complexType><xs:sequence><xs:element ref="experiment"/><xs:element name="session_id" type="xs:string"/><xs:element name="assessment">…
<?xml version="1.0" encoding="UTF-8"?><xs:schema xmlns:xnat="xnat.xsd" xmlns:xs="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" attributeFormDefault="unqualified"><xs:element name="Database"><xs:annotation><xs:appinfo><xnat:dbinfo database.name="CNDA" database="MYSQL"/></xs:appinfo></xs:annotation></xs:element><xs:element name="wm_mod_scheltens"><xs:complexType><xs:sequence><xs:element ref="experiment"/><xs:element name="session_id" type="xs:string"/><xs:element name="assessment">…
XML SchemaCRATE TABLE table (
name, VARCHAR(50), idMethod, VARCHAR(50), DEFAULT 'null‘, type, VARCHAR(50),ID INT UNSIGNED, NOT NULL AUTO_INCREMENT, PRIMARY KEY (ID) ); …
CREATE TABLE table_column ( name VARCHAR(50) javaName VARCHAR(50) primaryKey VARCHAR(50)
CRATE TABLE table (
name, VARCHAR(50), idMethod, VARCHAR(50), DEFAULT 'null‘, type, VARCHAR(50),ID INT UNSIGNED, NOT NULL AUTO_INCREMENT, PRIMARY KEY (ID) ); …
CREATE TABLE table_column ( name VARCHAR(50) javaName VARCHAR(50) primaryKey VARCHAR(50)
public class Experiment extends org.cnl.cnda.om.BaseExperiment implements Persistent{ public static final long MILLIS_IN_DAY = 86400000;
public static long getDays(Calendar c1, Calendar c2) { long time1 = c1.getTime().getTime();
public class Experiment extends org.cnl.cnda.om.BaseExperiment implements Persistent{ public static final long MILLIS_IN_DAY = 86400000;
public static long getDays(Calendar c1, Calendar c2) { long time1 = c1.getTime().getTime();
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
$page.setTitle("CNDA -- Integrating the Neurouniverse")$page.setLinkColor($ui.alink)$page.setVlinkColor($ui.vlink)
<html><body>
<table border="0"><tr> <td bgcolor="#336600"> …
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 3.2//EN">
$page.setTitle("CNDA -- Integrating the Neurouniverse")$page.setLinkColor($ui.alink)$page.setVlinkColor($ui.vlink)
<html><body>
<table border="0"><tr> <td bgcolor="#336600"> …
Database Schema
<?xml version="1.0" encoding="UTF-8"?><session id="050202_vc1000"> <subject map_num="0001" lab_id="0001"> <age>78</age> <gender>male</gender> <handedness>right</handedness> <cohort>ADRC</cohort> </subject> <session_info> <acq_date>5/1/2002</acq_date> <pi>Randy Buckner</pi> <operator>Dan
<?xml version="1.0" encoding="UTF-8"?><session id="050202_vc1000"> <subject map_num="0001" lab_id="0001"> <age>78</age> <gender>male</gender> <handedness>right</handedness> <cohort>ADRC</cohort> </subject> <session_info> <acq_date>5/1/2002</acq_date> <pi>Randy Buckner</pi> <operator>Dan
Java ClassesHTML Pages
This XML schema structure…
…becomes this database table
CREATE TABLE subjectData_g (ID VARCHAR(50) , birthDate DATE , deathDate DATE , name VARCHAR(50) , sex VARCHAR(50) , species_commonName VARCHAR(50) , species_latinName VARCHAR(50) , species_strain VARCHAR(50) , species_description VARCHAR(50) , subjectData_g_id INTEGER NOT NULL AUTO_INCREMENT , PRIMARY KEY (subjectData_g_id) );
More complicated elements…
…yield more complicated tables
CREATE TABLE studylevel_g (projectlevel_g_id INTEGER , subjectlevel_g_id INTEGER , visitlevel_g_id INTEGER , studyData_g_id INTEGER , levelcommon_g_id INTEGER , studylevel_g_id INTEGER NOT NULL AUTO_INCREMENT , PRIMARY KEY (studylevel_g_id) );
ALTER TABLE studylevel_g ADD KEY fk_projectlevel_g_id (projectlevel_g_id);
ALTER TABLE studylevel_g ADD FOREIGN KEY (projectlevel_g_id) REFERENCES projectlevel_g(projectlevel_g_id) ON DELETE SET NULL;
ALTER TABLE studylevel_g ADD KEY fk_subjectlevel_g_id (subjectlevel_g_id);
ALTER TABLE studylevel_g ADD FOREIGN KEY (subjectlevel_g_id) REFERENCES subjectlevel_g(subjectlevel_g_id) ON DELETE SET NULL;
ALTER TABLE studylevel_g ADD KEY fk_visitlevel_g_id (visitlevel_g_id);
ALTER TABLE studylevel_g ADD FOREIGN KEY (visitlevel_g_id) REFERENCES visitlevel_g(visitlevel_g_id) ON DELETE SET NULL;
ALTER TABLE studylevel_g ADD KEY fk_studyData_g_id (studyData_g_id);
ALTER TABLE studylevel_g ADD FOREIGN KEY (studyData_g_id) REFERENCES studyData_g(studyData_g_id) ON DELETE SET NULL;
ALTER TABLE studylevel_g ADD KEY fk_levelcommon_g_id (levelcommon_g_id);
ALTER TABLE studylevel_g ADD FOREIGN KEY (levelcommon_g_id) REFERENCES levelcommon_g(levelcommon_g_id) ON DELETE SET NULL;
XNAT is a three-tiered architecture
Raw Image Data
Processed Images
XML Data Files
Data Tables
Management Tables
SQL Database
Flat file system
Data Store
XNATEngine
XNAT Schema
XNAT Schema
Web server
User Interface
Command line
Web browser
The web application emphasizes usability and quality control Clean user interface Search and download, no statistics. Quality control
Security is pretty important too
Password protected login and session timeout. Secondary password and IP-address
restriction on most sensitive data. User access privileges set by data type and
meta data values (e.g. “Dan can view but not edit R Buckner’s fMRI data.”)
Signed approval on new user accounts and changes to existing accounts.
Logins, queries, and downloads written to daily log files.
XNAT is completely open source
All of XNAT’s dependencies are open source. Turbine (Apache Jakarta) provides “a servlet
based framework that allows [developers] to quickly build web applications.”
ImageJ (NIH) provides the foundation for the image viewer.
MySQL and PostgreSQL databases are supported.
XNAT improvements are on the way
Data quarantine Data history Direct XML Database exchange Improved image viewer with subcortical
segmentation and fMRI plugins. Improved mechanisms for controlling display
of data. Improved mechanisms for validating user
input from web forms.