#!/usr/bin/python26

import sys
import os
import csv
import pyxnat

csv_files = {'BPDwithPsy': 'SchizBull_2008/BPDwithPsy/BPDwithPsy_Basic_Demographics.csv', 
             'BPDwithoutPsy': 'SchizBull_2008/BPDwithoutPsy/BPDwithoutPsy_Basic_Demographics.csv', 
             'HC': 'SchizBull_2008/HC/HC_Basic_Demographics.csv', 
             'SS': 'SchizBull_2008/SS/SS_Basic_Dempgraphics.csv'}

seg_postfix = {'BPDwithPsy': '_seg.nii.gz', 
               'BPDwithoutPsy': '_seg.nii.gz', 
               'HC': '_seg.nii.gz', 
               'SS': '.seg.nii.gz'}

diagnoses = {'BPDwithoutPsy': 'Bipolar Disorder: Without Psychosis', 
             'BPDwithPsy': 'Bipolar Disorder: With Psychosis', 
             'HC': 'Normal', 
             'SS': 'Schizophrenia'}

def assert_exists(fname):
    if not os.path.exists(fname):
        raise IOError(fname)
    return

interface = pyxnat.Interface(os.environ['XNAT_URI'].rstrip('/'), 
                             os.environ['XNAT_USER'], 
                             os.environ['XNAT_PASSWORD'])
 
project = interface.select.project('cs_schizbull08')
assert project.exists()

for diagnosis in ('BPDwithPsy', 'BPDwithoutPsy', 'HC', 'SS'):
    reader = csv.reader(open(csv_files[diagnosis]))
    headers = reader.next()
    for row in reader:
        row_dict = dict(zip(headers, row))
        print row_dict['Subject']
        row_dict['Age'] = int(round(float(row_dict['Age'])))
        row_dict['Handedness'] = {'LH': 'left', 
                                  'RH': 'right', 
                                  'NR': None}[row_dict['Handedness']]
        subject = project.subject(row_dict['Subject'])
        assert not subject.exists()
        subject.create()
        subject.attrs.set('age', str(row_dict['Age']))
        subject.attrs.set('gender', row_dict['Gender'])
        subject.attrs.set('group', diagnoses[diagnosis])
        if row_dict['Handedness']:
            subject.attrs.set('handedness', row_dict['Handedness'])
        experiment = subject.experiment('%s_MR' % row_dict['Subject'])
        experiment.create()
        scan = experiment.scan('anat')
        scan.create()
        scan.attrs.set('type', 'anat')
        resource = scan.resource('NIfTI')
        resource.create()
        fname = 'SchizBull_2008/%s/%s/%s_procimg.nii.gz' % (diagnosis, 
                                                            row_dict['Subject'], 
                                                            row_dict['Subject'])
        assert_exists(fname)
        resource.file('anat.nii.gz').put(fname, 'NIfTI', 'RAW')
        assessor = experiment.assessor('%s_MR_seg' % row_dict['Subject'])
        assessor.create(assessors='ir:candiShareSegData')
        resource = assessor.out_resource('NIfTI')
        resource.create()
        fname = 'SchizBull_2008/%s/%s/%s%s' % (diagnosis, 
                                               row_dict['Subject'], 
                                               row_dict['Subject'], 
                                               seg_postfix[diagnosis])
        assert_exists(fname)
        resource.file('seg.nii.gz').put(fname, 'NIfTI', 'SEGMENTATION')

sys.exit(0)

# eof
