-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathextract_scanners_info.py
131 lines (121 loc) · 5.05 KB
/
extract_scanners_info.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import pyxnat as xnat
import pandas as pd
import argparse
import requests
import urllib3
urllib3.disable_warnings()
def getinterface(url, user, passwd):
"""
Create and test a connection to XNAT and returns the a pyxnat interface
object
:param url: xnat url as a string
:param user: xnat username as a string
:param passwd: xnat password as a string
"return: pyxnat interface object
"""
# Remove the last '/' to avoid requests issue
if url.endswith('/'):
url = url[:-1]
# Create the interface
intf = xnat.Interface(server=url,
user=user,
password=passwd,
verify=False)
try:
intf._exec('/data/JSESSION', method='DELETE')
except:
raise ValueError('Unable to connect to XNAT')
else:
try:
intf.manage.schemas.add('schemas/xnat.xsd')
except:
raise ValueError('Unable to download XNAT schema')
return intf
if __name__ == '__main__':
# Parser to set default values for xnat url and credentials
parser = argparse.ArgumentParser()
parser.add_argument('xnat_url',
help='Default XNAT instance URL',
type=str)
parser.add_argument('xnat_user',
help='Default XNAT username',
type=str)
parser.add_argument('xnat_pwd',
help='Default XNAT password',
type=str)
parser.add_argument('-p', '--project',
help='XNAT project where the data will be uploaded',
type=str,
default='ADNI')
requests.session().close()
args = parser.parse_args()
# # Check the xnat credentials
intf = getinterface(args.xnat_url,
args.xnat_user,
args.xnat_pwd)
# Extract information about the mrSessionsData
info = intf.select('xnat:mrSessionData',
['xnat:mrSessionData/SESSION_ID',
'xnat:mrSessionData/PROJECT',
'xnat:mrSessionData/SCANNER',
'xnat:mrSessionData/SUBJECT_ID',
'xnat:mrSessionData/VISIT',
'xnat:mrSessionData/TYPE',
'xnat:mrSessionData/'
'XNAT_COL_MRSESSIONDATAFIELDSTRENGTH']
).all()
intf.disconnect()
# Store the data in a pandas DataFrame
raw_data = pd.DataFrame(info)
raw_data = raw_data[raw_data['project'] == args.project]
print('List of visit types:')
for v in set(raw_data['type']):
print('- ' + v)
# Select only the baseline sessions
baseline = raw_data[(raw_data['type'] == 'ADNI Screening') |
(raw_data['type'] == 'ADNI Baseline')]
scanner_types = dict()
scan_number = [0, 0]
scanner_number = [0, 0]
siemens_number = [0, 0]
ge_number = [0, 0]
philips_number = [0, 0]
subject_list = []
for i, r in baseline.iterrows():
if r['subject_id'] in subject_list:
continue
subject_list.append(r['subject_id'])
site = r['session_id'].split('_')[0]
strength = r['xnat_col_mrsessiondatafieldstrength']
scanner = r['scanner'] + ' ' + strength
strength = 0 if float(strength) < 2 else 1
if site not in scanner_types.keys():
scanner_types[site] = dict()
if scanner not in scanner_types[site].keys():
scanner_types[site][scanner] = 0
scanner_number[strength] += 1
scanner_types[site][scanner] += 1
scan_number[strength] += 1
if 'SIEMENS' in scanner.upper():
siemens_number[strength] += 1
elif 'GE' in scanner.upper():
ge_number[strength] += 1
elif 'PHILIPS' in scanner.upper():
philips_number[strength] += 1
print(scanner_types)
print('Number of unique site = {}'.format(len(scanner_types.keys())))
print('Number of scanner = {} ({}/{})'.format(sum(scanner_number),
scanner_number[0],
scanner_number[1]))
print('Total number of scans = {} ({}/{})'.format(sum(scan_number),
scan_number[0],
scan_number[1]))
print('Number of siemens scans = {} ({}/{})'.format(sum(siemens_number),
siemens_number[0],
siemens_number[1]))
print('Number of ge scans = {} ({}/{})'.format(sum(ge_number),
ge_number[0],
ge_number[1]))
print('Number of philips scans = {} ({}/{})'.format(sum(philips_number),
philips_number[0],
philips_number[1]))