Tutorial¶
Login to your account¶
All actions in the platform need to be authenticated. In qmenta.core
,
the platform.post()
function has an instance of
qmenta.core.platform.Auth
for authentication. In order to
create an Auth
instance, you must use the
login()
function:
from qmenta.core.auth import Auth
auth = Auth.login('tutorial@qmenta.com', 'MyPassword1%')
The returned auth
object is used in all the
post()
calls in the remainder of this tutorial.
Instead of hard-coding the password, it is recommended to use
getpass.getpass()
or to read it from a configuration file.
Projects¶
All requests to the platform can be done using a post()
call.
We use parse_response()
to check the validity of the response and
to extract the JSON information from the Response
object:
from qmenta.core.platform import post, parse_response
projects = parse_response(post(
auth, 'projectset_manager/get_projectset_list'
))
The returned value will be a list of dictionaries, where each dictionary represents a project and its information. For example:
print(projects)
>>>
[ { '_id': 1,
'user_id': 'tutorial@qmenta.com',
'tags': ['test', 'example'],
'name': 'Example project',
'description': 'Example project for the qmenta.core tutorial',
'time_created': '2020-01-01 08:00:14'
},
{ '_id': 2,
'user_id': 'tutorial@qmenta.com'
'tags': ['example'],
'name': 'Another example project',
'description': 'Of course you can have more than one project',
'time_created': '2020-01-02 9:00:00'
}
]
To find a project with a specific name you can use, for example:
[p for p in projects if p['name'].startswith('Example')
>>>
[ { '_id': 1,
'user_id': 'tutorial@qmenta.com',
'tags': ['test', 'example'],
'name': 'Example project',
'description': 'Example project for the qmenta.core tutorial',
'time_created': '2020-01-01 08:00:14'
}
]
Subjects¶
Get existing subjects¶
To get the list of existing subjects in a project, you first activate the project, and then request the list of subjects:
post(auth, 'projectset_manager/activate_project', data={'project_id': 6})
subjects = parse_response(post(auth, 'patient_manager/get_patient_list'))
You can then view the subject data as a dict:
print(subjects[0])
>>>
{ '_id': 5395.0,
'age_at_scan': None,
'config': { 'time_created': {'$date': 1545840544017},
'time_modified': {'$date': 1545840557867}
},
'container_id': 26817,
'data_location': 'us',
'date_at_scan': None,
'owner': 'Tutorial user',
'patient_secret_name': '123_4567',
'qa_comments': '',
'qa_status': '',
'site': '',
'ssid': '1',
'tags': ['healthy'],
'user_id': 'tutorial@qmenta.com'
}
Create a new session¶
To add a new subject to an existing project, you only need to specify its name:
resp = post(
auth, 'patient_manager/upsert_patient', data={'secret_name': 'john-doe'}
)
parse_response(resp)
>>>
{ 'success': 1,
'message': 'Session data inserted successfully !',
'ssid': '1'
}
This will automatically create the first session, with session ID
ssid = 1
.
Executing the same command again will add another session with
ssid = 2
to the subject. To get the Session IDs belonging to the
newly added subject with the given patient_secret_name
, execute:
subjects = parse_response(post(auth, 'patient_manager/get_patient_list'))
[(s['_id'], s['patient_secret_name'], s['ssid']) for s in subjects
if s['patient_secret_name'] == 'john-doe']
>>>
[ (416522.0, 'john-doe', '1'),
(416523.0, 'john-doe', '2')
]
Upload data¶
Sessions can be uploaded using the qmenta.core.upload
module.
To upload a single ZIP file to a project with Project ID 100, use:
from qmenta.core.upload import SingleUpload, FileInfo
upload = SingleUpload(
auth, '/home/tutorial/data/file0.zip', FileInfo(project_id=100)
)
upload.start()
It is optional to add name, subject_name and session_id as attributes
of FileInfo
. If they are not specified, values will be chosen
automatically. Instead of specifying a ZIP file to be uploaded, a directory
may be given, and it will automatically be zipped before uploading.
When uploading a large amount of files, use
MultipleThreadedUploads
:
from qmenta.core.upload import MultiThreadedUploads, FileInfo
multi_upload = MultipleThreadedUploads(auth)
pid = 100
multi_upload.add_upload(
'/home/tutorial/data/file1.zip',
FileInfo(project_id=pid, name='file1')
)
multi_upload.add_upload(
'/home/tim/data/file2.zip',
FileInfo(project_id=pid, name='file2')
)
When using MultipleThreadedUploads
, the uploads are started automatically, and
multiple files will be uploaded in parallel.
In order to see the upload progress, connect to the blinker
signals
upload-status and upload-progress before starting the uploads. For example:
from blinker import signal
def progress_changed(caller, upload_index):
single_upload = caller
bytes_in_mb = 1024.0 * 1024.0
percentage = (100.0 * single_upload.bytes_uploaded /
single_upload.file_size)
progress_message = ('[{:.0f}%] Progress for upload {} ({}): {:.2f}'
' / {:.2f} MB').format(
percentage,
upload_index, single_upload.upload_filename,
single_upload.bytes_uploaded / bytes_in_mb,
single_upload.file_size / bytes_in_mb
)
print(progress_message)
def status_changed(caller, upload_index):
single_upload = caller
print('Status changed to {}'.format(single_upload.status.name))
on_progress = signal('upload-progress')
on_progress.connect(progress_changed)
on_status = signal('upload-status')
on_status.connect(status_changed)