Source code for mova.job

import logging
import os
import shlex
import subprocess
from rq import Queue
from redis import Redis

from mova.config import pacs_config, dcmtk_config
from mova.executor import run

logger = logging.getLogger('job')


[docs]def transfer_command(dcmkt_config, pacs_config, target, study_uid, series_uid): """ Constructs the first part of the transfer command to a PACS node. """ return dcmkt_config.dcmtk_bin + '/movescu -v -S ' + _transfer( dcmkt_config, pacs_config, target, study_uid, series_uid)
def _transfer(dcmkt_config, pacs_config, target, study_uid, series_uid): return '-aem {} -aet {} -aec {} {} {} -k StudyInstanceUID={} -k SeriesInstanceUID={} {}'.format( target, pacs_config.ae_title, pacs_config.ae_called, pacs_config.peer_address, pacs_config.peer_port, study_uid, series_uid, dcmkt_config.dcmin)
[docs]def transfer_series(config, series_list, target): dcmtk = dcmtk_config(config) pacs = pacs_config(config) for entry in series_list: study_uid = entry['study_uid'] series_uid = entry['series_uid'] command = transfer_command(dcmtk, pacs, target, study_uid, series_uid) args = shlex.split(command) queue(args) logger.debug('Running transfer command %s', args) return len(series_list)
[docs]def base_command(dcmtk_config, pacs_config): """ Constructs the first part of a dcmtk command. """ return dcmtk_config.dcmtk_bin \ + '/movescu -v -S -k QueryRetrieveLevel=SERIES ' \ + '-aet {} -aec {} {} {} +P {}'.format(pacs_config.ae_title, \ pacs_config.ae_called, pacs_config.peer_address, \ pacs_config.peer_port, pacs_config.incoming_port)
[docs]def download_series(config, series_list, dir_name): """ Download the series. The folder structure is as follows: MAIN_DOWNLOAD_DIR / USER_DEFINED / PATIENTID / ACCESSION_NUMBER / SERIES_NUMER """ output_dir = config['IMAGE_FOLDER'] dcmtk = dcmtk_config(config) pacs = pacs_config(config) for entry in series_list: image_folder = _create_image_dir(output_dir, entry, dir_name) study_uid = entry['study_uid'] series_uid = entry['series_uid'] if not all([study_uid, series_uid]): print("Error missing either study_uid or series_uid") print("study_uid:", study_uid) print("series_uid:", series_uid) print("accession number:", entry.get('accession_number')) continue command = base_command(dcmtk, pacs) \ + ' --output-directory ' + image_folder \ + ' -k StudyInstanceUID=' + study_uid \ + ' -k SeriesInstanceUID=' + series_uid \ + ' ' + dcmtk.dcmin args = shlex.split(command) queue(args) logger.debug('Running download command %s', args) return len(series_list)
[docs]def queue(cmd): redis_conn = Redis() q = Queue(connection=redis_conn) # no args implies the default queue j = q.enqueue(run, cmd) return j
def _create_image_dir(output_dir, entry, dir_name): patient_id = entry['patient_id'] accession_number = str(entry['accession_number']) series_number = str(entry['series_number']) image_folder = os.path.join(output_dir, dir_name, patient_id, accession_number, series_number) if not os.path.exists(image_folder): os.makedirs(image_folder, exist_ok=True) return image_folder